Следуйте правилам 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...
Здесь вопрос... Я сомневаюсь в тех "моих" структурах...
- правильно передать указатель на objManager в каждом контроллере, который использует это?
- как 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
Я надеюсь, что это поможет вам организовать ваш код. Конечно, дизайн кода - это очень личная и субъективная тема. Вы должны использовать то, что вам удобно и лучше понимать.