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软件包安装。

使用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)