Шаблон MVC в приложении wxPython - PullRequest
0 голосов
/ 15 марта 2019

Думаю, это вечная тема: как реализовать шаблон 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.

Любое понимание этого высоко ценится.

...