wxPython MVC 与 GUI 一起工作

wxPython MVC working with GUI

我在 1 class 中有一个工作程序。我希望将其转换为 MVC 模式。

我已经将观察者设计实现为 shown here,并且我为模型、视图和控制器打开了 3 个 .py 文件。 我无法理解发生了什么。

例如: 此代码在原 class

    helpMenu = wx.Menu()
    helpMenu.Append(ID_ABOUT, "&About", "Display info")

    self.Bind(event=wx.EVT_MENU, handler=self.OnHelpAbout, id=ID_ABOUT)

...

def OnHelpAbout(self,e):
    title = self.GetTitle()
    d = wx.MessageDialog(self, "About " + title, title, wx.ICON_INFORMATION | wx.OK)
    d.ShowModal()
    d.Destroy()

此菜单代码行应在View中,功能OnHelpAbout应在Controler中实现。但是我怎么称呼它呢?我应该在视图中有一个控制器实例吗?我在哪里为观察员签名? 另外,如果此功能设置对话框 = 在视图中进行更改,我该怎么做?如果我理解正确,我需要在视图中调用另一个函数并将代码放在那里?

我想我缺少的是一个可以使用的基本模板。我还没有找到任何来源来解释如何使用 GUI 和 GUI 事件来做到这一点。

The MVC entry in the wxPython wiki 很好地洞察了关注点的分离方式。第一个(较新的)示例利用 pypubsub,底部的旧示例单独处理 wx.Events

虽然它可能符合也可能不符合严格的 MVC 范式,但它精美地展示了模型是如何从视图和控制器中分离出来的。

在您的示例中,菜单的创建(前两行)将进入视图。控制器将持有事件方法 (OnHelpAbout) 并在菜单项上进行绑定。对于模型,您的示例将没有代码。框架标题可以保存在控制器中,并在 object creation/after 创建时放入框架中。

UPDATE/EDIT1

这不是精确的科学,正如已经指出的那样,可能会变得混乱。以下如何:

view.py

class myframe(wx.Frame):
    def __init__(…
        # code for menu creation goes here
        self.helpmenu = …

controller.py

from view import myframe

class mycontroller(object):
    def __init__(self, app):
        self.title = 'mytitle'
        self.frame = myframe(…
        self.frame.SetTitle(self.title)

        self.frame.helpmenu.Bind(…, handler=self.OnHelpAbout, …)

        self.frame.Show()

    def OnHelpAbout(self, evt):
        title = self.title
        # show message dialog
        …

if __name__ == '__main__':
    app = wx.App(…
    ctrler = mycontroller(app)
    app.MainLoop()

如果您设法找到 "pure" 解决方案,请叫醒我……