wxpython笔记:wx.lib.pubsub与PyPubSub发布订阅
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简单的例子
1 2 | #订阅主题,接收这个主题的信息 #pub.subscribe(callable, topic) |
1 2 | #发布主题,并向这个主题发送信息 #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
安装
1 | pip install pypubsub |
替换包
1 2 | from wx.lib.pubsub import pub from pubsub import pub |
发布订阅怎么做
1 | pub.subscribe(self.myListener, "panelListener" ) |
1 | pub.sendMessage( "panelListener" , message=msg) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?