Следуйте правилам MVC с несколькими контроллерами

Я немного сомневаюсь, что для написания приложения на Python следует правилам MVC на wxPython.

Пример:

MainForm

PanelLst (ListCtrl + некоторые кнопки)

PanelTree (TreeCtrl + ProgressBar)

Я создал 3 вида (ListView, TreeView, ButtonView). Я также создал 3 контроллера (ListController, TreeController, ButtonControllor). В основном приложении у меня есть объект (objManager), который управляет некоторыми моделями.

Все 3 контроллера имеют указатель на App.objManager() для выполнения некоторых вещей.

Например: нажмите на строку в ListController, запустите App.objManager(). Foo1

нажмите на кнопку в ButtonController выполнить App.objManager(). bar1, ecc...

Здесь вопрос... Я сомневаюсь в тех "моих" структурах...

  1. правильно передать указатель на objManager в каждом контроллере, который использует это?
  2. как View/Controllers могут правильно общаться между собой? На самом деле я использую аналогичный способ, как модель. Использование wxPython publisher.sendMessage (EVENT, data) и publisher.subscribe(EVENT, onEvent), но я думаю, что это не лучший способ...

Следующее сомнение:

TreeController, получить сообщение от модели. Необходимо загрузить большой список в дереве, показывающий прогресс. Я уже пользуюсь потоком с некоторым wx.PostEvent, но какое решение лучше?

Решение 1:

Индикатор()

# Callback via publisher.subscrive(self.onUpdateStatus, "UPDATE_STATUS")
def onUpdateStatus(self, msg)
    nValue = msg.data
    self.gauge.setValue(nValue)

В виде дерева()

def loadTree(self, items):
    for nItem, item in enumerate(items):
        tree.addItem(item)
        pub.sendMessage(UPDATE_STATUS, item)

TreeCtrl ()

 # Callback function via publisher.subscribe(self.onLoadTree, "LOAD_TREE")
 def onLoadTree():
     items = self.objManager.getList()
     self.hTreeView.loadTree(items)

Решение 2

Индикатор()

# Callback via publisher.subscrive(self.onUpdateStatus, "UPDATE_STATUS")
def onUpdateStatus(self, msg)
    nValue = msg.data
    self.gauge.setValue(nValue)

В виде дерева()

def loadTree(self, item):
    self.addTreeItem(item)

TreeCtrl ()

 # Callback function via publisher.subscribe(self.onLoadTree, "LOAD_TREE")
 def onLoadTree():
     items = self.objManager.getList()
     for nItem, item in enumerate(items):
         self.hTreeView.loadTree(item)
         pub.sendMessage(UPDATE_STATUS, item)

Какое решение лучше? В первом решении это ВИД, который отправляет сообщение для обновления GUI. Вторым решением является КОНТРОЛЛЕР, который отправляет сообщение. Не уверен, что эти два решения в любом случае являются наилучшей практикой для связи между контроллером / представлением.

Спасибо и извините за мой плохой английский...

1 ответ

Решение

Я думаю, что использование pubsub - совершенно законный способ связи между моделью и контроллерами. Пару месяцев назад я работал с другим разработчиком wxPython, чтобы создать пример приложения, демонстрирующего один из способов сделать это. Вы можете увидеть наш код здесь: https://bitbucket.org/driscollis/medialocker

Я надеюсь, что это поможет вам организовать ваш код. Конечно, дизайн кода - это очень личная и субъективная тема. Вы должны использовать то, что вам удобно и лучше понимать.

Другие вопросы по тегам