Думаю, это вечная тема: как реализовать шаблон MVC в приложении wxpython.
В моем случае я могу четко отделить модель от остальных. Проблема, с которой я борюсь, это разделение Контроллера и Представления: мне кажется, что GUI, по сути, оба из них, поскольку он предоставляет средства для управления, но также отображает модель.
В моей текущей реализации подклассом wx.App () является THE Controller, в котором происходит связывание методов, то есть событие в GUI вызывает метод контроллера, который вызывает соответствующие методы в GUI.
Простой пример: сохранение данных.
class Controller(wx.App):
def __init__(self, redirect=False):
super(Controller, self).__init__(redirect)
self.view = None # the view
self.model = None # the model
self._path_to_saved_file = None
def start(self):
self.model = ModelRoot() # the model
self.view = MainFrame(None, -1, _('App Name'), size=(1250, 690))
self.bind_gui_elements()
self.SetTopWindow(self.view)
self.view.Show()
self.MainLoop()
Связывание меню «Файл / Сохранить» в self.bind_gui_elements()
:
self.view.Bind(wx.EVT_MENU, self.OnSave, self.view.file_menu_save)
с:
def OnSave(self, event):
if self._path_to_saved_file is None: # path unknown
self.view.OnSaveAs() # Save as dialog; returns nothing but emits a pubsub message
self.save_to_file() # dump the model data
В self.view OnSaveAs реализован в виде стандартного диалогового окна «Сохранить как», в котором пользователь может перейти к нужному каталогу, дать имя и т. Д. Этот метод отправляет сообщение с указанным пользователем путем к теме, на которую подписан контроллер. поэтому атрибут self._path_to_saved_file будет установлен.
Данные в self._model_description затем записываются контроллером в файл.
Полагаю, таким образом, представление и его обязанности четко отделены от контроллера. Однако, Контроллер все еще должен знать, что графический интерфейс реализован в wxPython, и именно здесь у меня возникает ощущение размытия линий.
У меня есть ощущение, что дальнейшее разделение Controller и View может быть выполнено с помощью инфраструктуры обмена сообщениями pubsub, но также это приведет к написанию гораздо большего количества кода. С другой стороны, графический интерфейс пользователя может быть чем угодно.
Я надеюсь, что моя проблема описана достаточно хорошо, чтобы задать вопрос: верна ли текущая реализация или имеет смысл дополнительно разделить View и Controller? Строгое следование принципу MVC потребует этого. Однако я не думаю, что переключусь на другой модуль GUI.
Любое понимание этого высоко ценится.