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)