【问题标题】:wxPython MVC working with GUIwxPython MVC 使用 GUI
【发布时间】:2015-08-25 14:13:11
【问题描述】:

我在一堂课上有一个工作计划。我希望将其转换为 MVC 模式。

我已将观察者设计实现为shown here,并为模型、视图和控制器打开了 3 个.py 文件。 我很难理解去哪里了。

例如: 原类中的这段代码

    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 事件的来源。

【问题讨论】:

  • GUI 代码通常是“视图”。事件处理程序只会调用“控制器”中的内容。除非您有数据库或使用 XRC 之类的东西,否则模型很难定义。
  • 我知道。设置问题是因为在我的情况下 OnHelpAbout 是控制器功能也需要更改视图。所以我问我该怎么做。另外,我如何在控制器中设置事件。我应该在 GUI 中有一个控制器实例吗?
  • 是的,这变得一团糟。我没有严格遵守规则,因为我认为它们不能很好地与桌面 GUI 库一起使用。但是,您可以使用 pubsub 从控制器向视图发送一条消息,告诉它进行更新。至于您的第二个问题,我只需将控制器模块导入您的 GUI 代码并适当地调用它们:controller.DoSomething()

标签: python model-view-controller wxpython observer-pattern


【解决方案1】:

The MVC entry in the wxPython wiki 很好地洞察了关注点的分离可能是什么样子。第一个(较新的)示例利用pypubsub,底部的旧示例仅处理wx.Events。

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

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

更新/编辑1

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

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()

如果您设法找到“纯”解决方案,请叫醒我……

【讨论】:

  • 我在打开这个问题之前阅读了那里的例子......它没有回答我的问题。那里没有 GUI 事件。我想你没有理解我的问题。在您的回答中,您写了去哪里。我已经知道这些信息,并在我的问题中写了它。我不知道如何拨打电话。我应该在哪里有控制器的实例?我应该在哪里有 View 的实例?我如何更改 OnHelpAbout 以符合 MVC 模式,因为此功能执行 GUI 命令,但它应该在控制器中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 2023-04-04
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
相关资源
最近更新 更多