Следуйте правилам MVC с несколькими контроллерами - PullRequest
3 голосов
/ 16 сентября 2011

Я немного сомневаюсь, что при написании 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, данные) и 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 решения в любом случае являются наилучшей практикой для связи между контроллером / представлением.

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

1 Ответ

1 голос
/ 17 февраля 2012

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

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

...