如果只是写个脚本自己用,命令行就够了,不需要 GUI。但只要要交付给客户,就必须有一个像样的界面。Python 上可选的 GUI 库不少,我把自己试过和排除的理由写下来,供你参考。
先说结论
做需要交付给客户的桌面工具,我会选 PySide6,理由有三条:
- 许可证友好:PySide6 是 Qt 官方提供的 Python 绑定,采用 LGPL 协议,可以用于闭源的商业软件,不需要开源自己的代码。
- 基础设施齐全:窗口、系统托盘、图表、多媒体、WebEngine 都有现成模块,不用自己造轮子。
- 界面好写:支持 QSS 样式表,调界面像写 CSS;信号与槽机制让多线程和界面之间的通信变得很直接。
几个候选方案的对比
| 方案 | 许可证 | 商用限制 | 我的评价 |
|---|---|---|---|
| tkinter | Python 自带 | 无 | 上手最快,但控件简陋,稍复杂的功能都要自己画 |
| PySimpleGUI | LGPL | 无 | 封装了 tkinter,写起来简单,但高级功能同样要自己造 |
| wxPython | wxWindows 协议 | 无 | 生态不错,但我没有实际用过,不做评价 |
| PyQt | GPL / 商业双授权 | 闭源商用需购买商业授权 | 功能与 PySide6 基本一致,但许可证是硬伤 |
| PySide6 | LGPL | 可闭源商用 | 交付给客户的工具用它最省心 |
PyQt 和 PySide6 的差别主要就在许可证上。 两者都是 Qt 的 Python 绑定、API 几乎一致,但 PyQt 采用 GPL 协议 —— 如果你的软件不开源又要商用,就必须购买商业授权。PySide6 是 Qt 官方出品,LGPL 允许你闭源发布,只要保持动态链接、不修改 Qt 自身源码即可。这是我最终选它的决定性原因。
为什么不用 tkinter 和 PySimpleGUI
这两个的问题是「简单的事情很简单,复杂的事情很复杂」:
- 想要圆角窗口、自定义标题栏、系统托盘、好看的表格,都得自己造轮子
- 想要多线程跑任务的同时更新界面,也得自己设计一套通信机制
- 界面风格基本停留在十年前,客户拿到手上会觉得「这不像个正规软件」
而在 PySide6 里,这些都有现成的控件和机制。学习成本上那点差异,踩一次坑就赚回来了。
为什么不用 Qt5
Qt5 的 Python 绑定(PyQt5)同样是 GPL 协议,闭源商用一样要买授权。而且 Qt6 已经是当前主线,新项目没有理由再从 Qt5 开始。
PySide6 就是 Qt6 的官方 Python 绑定,用法与 Qt5 / PySide2 基本一致,迁移成本很低。
我实际用它做了什么
直播定时助手这类工具对 GUI 的要求其实并不低:
- 主窗口要能最小化到系统托盘,定时任务在后台照常运行
- 任务执行时界面要实时刷新状态,不能卡死
- 窗口需要置顶显示,方便用户对照直播伴侣操作
- 配置项多,需要表格、下拉、多选框组合
这些用 PySide6 都能直接实现:主线程只负责界面,耗时逻辑放到 QThread 或工作线程里,通过信号与槽回传状态,界面始终不卡。这块的具体做法我会另写一篇细说。
什么时候不该选 PySide6
它也不是所有场景都合适:
- 只自己用的小脚本:命令行参数就够,上 GUI 是浪费时间
- 对体积要求极致:PySide6 打包后动辄几十 MB,比 tkinter 方案大得多
- 只做一个极简输入框:tkinter 十几行就能搞定,没必要引入 Qt
小结
选 GUI 库本质上是权衡三件事:许可证能不能商用、要造多少轮子、界面能不能达标。
对要交付给客户的商业工具来说,PySide6 在这三点上比较均衡,所以是我的默认选择。以上仅供参考。