python - wx.lib.pubsub.Publisher从按下按钮调用时不工作?

时间:2010-11-22 12:06:44

标签: python wxpython messaging

我正在使用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

有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

您需要保存对控制器的引用,否则对象将获得GC,因此在发送消息时将不存在。将倒数第二行更改为:

controller = Controller(app)