
本文详解如何解决 `wx.lib.pubsub has been deprecated` 报错,通过安装 pypubsub 并修改 python 源码中的导入语句与调用方式,完成平滑迁移。步骤清晰、附带可运行示例和关键注意事项。
当你在运行基于 wxPython 的 GUI 应用时遇到如下错误:
wx.lib.pubsub has been deprecated, please migrate your code to use pypubsub
这表示你正在使用的 wx.lib.pubsub(wxPython 内置的轻量消息发布/订阅模块)已被官方弃用,自 wxPython 4.0+ 起,推荐迁移到功能更完善、维护更活跃的独立库 —— pypubsub。
✅ 迁移三步走
1. 安装 pypubsub
在终端(Windows:命令提示符或 PowerShell;macOS/Linux:Terminal)中执行:
pip install pypubsub
✅ 提示:无需卸载 wxPython,pypubsub 与之完全兼容,且支持 Python 3.7–3.12。
2. 修改你的 Python 源文件(关键!)
⚠️ 你不需要修改 pypubsub 自身的代码 —— 那是第三方库,应保持原样。你需要定位并编辑你自己项目中的 Python 文件(通常是 .py 结尾的脚本或模块),尤其是那些包含以下旧导入语句的位置:
立即学习“Python免费学习笔记(深入)”;
# ❌ 已弃用(请删除或注释掉) from wx.lib.pubsub import pub
将其替换为标准 pypubsub 导入方式:
# ✅ 推荐新写法(兼容 v4.x,默认使用 `arg1=...` 命名参数风格) from pubsub import pub
? 如何找到要改的文件?
- 如果你双击 .pyw 或 .py 启动程序,该文件就是主入口;
- 使用 VS Code / PyCharm 等编辑器全局搜索 wx.lib.pubsub 或 from wx.lib import pubsub;
- 常见位置:main.py、app.py、frame.py、controller.py 等业务逻辑文件。
3. 验证 API 兼容性(通常无需改动)
pypubsub v4.x 默认启用 kwargs 模式(即按参数名传递消息),这与旧版 wx.lib.pubsub 的行为高度一致。因此,绝大多数情况下,仅修改导入语句即可运行成功。
例如,原有代码:
from wx.lib.pubsub import pub
def on_data_update(data):
print("Received:", data)
pub.subscribe(on_data_update, "data.updated")
pub.sendMessage("data.updated", data={"value": 42})迁移后保持结构不变,仅更新导入:
from pubsub import pub # ✅ 唯一必需修改
def on_data_update(data):
print("Received:", data)
pub.subscribe(on_data_update, "data.updated")
pub.sendMessage("data.updated", data={"value": 42}) # ✅ 参数名传递仍有效? 完整可运行示例(验证环境)
保存为 helloworld_pubsub.py 并运行:
"""
pypubsub 快速入门示例
"""
from pubsub import pub
def listener1(arg1, arg2=None):
print('Function listener1 received:')
print(' arg1 =', arg1)
print(' arg2 =', arg2)
pub.subscribe(listener1, 'rootTopic')
print('Publish something via pubsub')
anObj = dict(a=456, b='abc')
pub.sendMessage('rootTopic', arg1=123, arg2=anObj)预期输出:
Publish something via pubsub
Function listener1 received:
arg1 = 123
arg2 = {'a': 456, 'b': 'abc'}⚠️ 注意事项与常见问题
- 不要手动修改 site-packages/pypubsub/ 下的任何文件 —— 所有改动仅发生在你自己的项目源码中;
- 若项目曾显式指定 pubsub 版本(如 pip install pypubsub==3.3.0),请升级至 >=4.0.3 以获得最佳兼容性;
- 高级用户如需切换消息协议(如 args 模式),可通过 pub.setProtocolVersion(1) 控制,但绝大多数 GUI 应用无需此操作;
- 在多线程 wxPython 应用中,pypubsub 天然线程安全,无需额外加锁。
完成以上步骤后,重启你的应用,弃用警告将彻底消失,且消息通信功能保持完全一致 —— 这是一次零风险、高收益的现代化升级。










