← Back to blog

Python GUI 应该怎么选?为什么要选择 PySide6?

如果只是写个脚本自己用,命令行就够了,不需要 GUI。但只要要交付给客户,就必须有一个像样的界面。Python 上可选的 GUI 库不少,我把自己试过和排除的理由写下来,供你参考。

先说结论

做需要交付给客户的桌面工具,我会选 PySide6,理由有三条:

  1. 许可证友好:PySide6 是 Qt 官方提供的 Python 绑定,采用 LGPL 协议,可以用于闭源的商业软件,不需要开源自己的代码。
  2. 基础设施齐全:窗口、系统托盘、图表、多媒体、WebEngine 都有现成模块,不用自己造轮子。
  3. 界面好写:支持 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 在这三点上比较均衡,所以是我的默认选择。以上仅供参考。