wx.lib.pubsub
wx.lib.pubsub模块提供了一个发布-订阅代理,让您的应用程序的部分给定主题的应用程序的其他部分的广播消息。侦听器可以是应用程序中的任何可调用对象,即函数,绑定方法,具有call的任何对象等。请注意,pubsub本身并不通过网络进行代理,而只能在应用程序内工作。
资料:https://wiki.wxpython.org/WxLibPubSub
历史
在wxPython 2.8.11(2010年春季)之前,wx.lib.pubsub是一个模块,称为“原始” pubsub或“ pubsub版本1”。在2007 年前后,Pubsub获得了独立于wxPython的自己的住所,成为PyPubSub。对其进行了重写,以提供更通用的API,该API更好地支持自定义异常处理程序,通知,主题树规范,以及通过命名参数的更具表现力的消息数据签名。新的API,称为“版本3”,与版本1 不向后兼容。但是wx.lib.pubsub保留了最初的pubsub实现已有几年了。
从wxPython 2.8.11开始,wx.lib.pubsub集成了新的PyPubSub。在wxPython 2.8.11中,将wx.lib.pubsub配置为公开PyPubSub的“版本1” API,而不是更新的,功能更强大的版本3 API。如果准备好了,这将使pubsub用户有机会将其基于wxPython的应用程序升级到pubsub版本3。要在wxPython> = 2.8.11.0中使用新的版本3 API,应用程序必须通过配置模块专门请求它,稍后将进行讨论。
PubSub的发展现在托管在http://sourceforge.net/projects/pubsub|SourceForge ]作为PyPubSub(尽管原因太多时间去解释SourceForge的项目名称是“发布-订阅”,而不是“pypubsub”),是独立的,即它不需要使用wxPython。因此,仍然使用低于2.8.11.0的wxPython版本但希望使用新的pubsub版本3 API的开发人员可以从SF.net下载PyPubSub并将其作为独立的Python软件包安装。
- Project on PyPI: https://pypi.python.org/pypi/
- The documentation for latest stable release is at http://pypubsub.readthedocs.io.
- The documentation for latest code is at http://pypubsub.readthedocs.io/en/latest.
使用wx.lib.pubsub简单的例子
#订阅主题,接收这个主题的信息 #pub.subscribe(callable, topic)
#发布主题,并向这个主题发送信息 #pub.sendMessage(topic,参数名=参数值...)
import wx from wx.lib.pubsub import pub class MyFrame(wx.Frame): def __init__(self,parent=None): super(MyFrame, self).__init__(parent,-1,"文本框",size=(300,150)) panel = wx.Panel(self,-1) self.button = wx.Button(panel,-1,"确定",pos=(10,10)) self.Bind(wx.EVT_BUTTON,self.OnClick,self.button) self.button.SetDefault() #将按钮设置为默认按钮,不然会是选中状态,边框不同 self.inputText = wx.TextCtrl(panel,-1,"",pos=(100,10),size=(150,-1),style=wx.TE_READONLY) #订阅主题,接收这个主题的信息 #pub.subscribe(callable, topic) pub.subscribe(self.recive, 'object.added') def OnClick(self,event): #发布主题,向这个主题发送信息 pub.sendMessage('object.added', data=42, extra1='hello!') pub.sendMessage('object.added', data=23, extra1='hello!', extra2=[2, 3, 5, 7, 11, 13, 17, 19, 23]) def recive(self,data, extra1, extra2=None): print(data) print(extra1) if extra2: print(extra2) self.inputText.Value = str(data) app = wx.App() frame = MyFrame() frame.Show() app.MainLoop()
如何过渡到PyPubSub
安装
pip install pypubsub
替换包
from wx.lib.pubsub import pub from pubsub import pub
发布订阅怎么做
pub.subscribe(self.myListener, "panelListener")
pub.sendMessage("panelListener", message=msg)