我正在使用MVC实施wxPyton应用,我遇到wx.lib.pubsub.Publisher问题。
我想让我的Controller尽可能与我的视图分开。例如,我不希望我的控制器“知道”视图中使用的按钮的名称。在wxPython example上,控制器必须知道它们,因此它可以将动作绑定到它们。
class Controller:
...
self.view2.add.Bind(wx.EVT_BUTTON, self.AddMoney)
self.view2.remove.Bind(wx.EVT_BUTTON, self.RemoveMoney)
我更多地考虑使用wx.lib.pubsub.Publisher
消息“解耦”事物:
from wx.lib.pubsub import Publisher as pub
class Controller:
...
pub.subscribe(self.AddMoney, "MONEY ADDED")
pub.subscribe(self.RemoveMoney, "MONEY REMOVED")
视图会将控件绑定到只发送消息的操作。
但是,唉,它似乎没有用。视图拒绝发送事件,或者控制器拒绝从视图接收消息。我不确定。
这是一个小示例应用程序,用于说明我的问题(我已经使用python 2.6.6和wxPython 2.8进行了测试)
import wxversion
wxversion.ensureMinimal('2.8')
import wx
from wx.lib.pubsub import Publisher as pub
class View(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="Main View")
self.button = wx.Button(self, -1, "foo?")
self.button.Bind(wx.EVT_BUTTON, self.ChangeFoo)
def ChangeFoo(self, evt):
print('Binding works')
pub.sendMessage("FOO CHANGED")
class Controller:
def __init__(self, app):
self.view = View()
pub.subscribe(self.FooChanged, "FOO CHANGED")
self.view.Show()
def FooChanged(self, message):
print('Messaging works')
app = wx.App(False)
Controller(app)
app.MainLoop()
该应用程序显示一个带有大按钮的窗口。按下后的预期输出是:
Binding works
Messaging works
但我得到了:
Binding works
有谁知道如何解决这个问题?
答案 0 :(得分:4)
您需要保存对控制器的引用,否则对象将获得GC,因此在发送消息时将不存在。将倒数第二行更改为:
controller = Controller(app)