Я немного сомневаюсь, что при написании 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, данные) и publisher.subscribe (EVENT, onEvent) , но я думаю, что это не лучший способ ..
Следующее сомнение:
TreeController, получите сообщение от модели. Необходимо загрузить большой список в дереве, показывающий прогресс.
Я уже пользуюсь потоком с некоторым wx.PostEvent, но какое решение лучше?
Решение 1:
ProgressBar ()
# Callback via publisher.subscrive(self.onUpdateStatus, "UPDATE_STATUS")
def onUpdateStatus(self, msg)
nValue = msg.data
self.gauge.setValue(nValue)
TreeView ()
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
ProgressBar ()
# Callback via publisher.subscrive(self.onUpdateStatus, "UPDATE_STATUS")
def onUpdateStatus(self, msg)
nValue = msg.data
self.gauge.setValue(nValue)
TreeView ()
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. Вторым решением является КОНТРОЛЛЕР, который отправляет сообщение.
Не уверен, что эти 2 решения в любом случае являются наилучшей практикой для связи между контроллером / представлением.
Спасибо и извините за мой плохой английский ...