wxPython:向多个控件发送信号
我甚至不知道该怎么问这个问题。我想要一个类似于wxPython事件系统的东西,但又有点不同。我会尽量解释清楚。
当我的程序中发生某种变化(比如说“树的变化”,具体是什么就不说了),我想给我程序里的所有小部件发送一个信号,通知它们“树的变化”发生了,它们应该根据这个变化来更新自己的显示。
我该怎么做呢?这听起来有点像wxPython的事件,但又不完全一样,因为我知道事件并不会传播到所有的小部件。
有什么好的方法可以做到这一点吗?
2 个回答
0
看看观察者设计模式吧。你需要把小部件(widgets)当作观察者来实现,而信号发送者则是主题(subject)。这样每当主题发送信号时,所有的观察者都会收到通知。
6
你可以自己写一个发布-订阅机制,这个机制可以简单到像这样:
def register(self, callback):
self.callbacks.append(callback)
def emit(self, eventName):
for callback in self.callbacks:
callback(eventName)
任何想要监听事件的人都可以在一个中心注册自己的函数,然后你就可以向感兴趣的人发出事件。你还可以进一步改进,比如让他们注册特定的事件、支持多个注册者、取消注册、进行错误检查等等。
另外,你也可以使用wxPython的wx.lib.pubsub模块,或者其他一些Python库,比如PyPubsub和PyDispatcher。