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" 解决方案,请叫醒我……
我在 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" 解决方案,请叫醒我……