初学者应从 Tkinter 入手:装完 Python 即可运行,无依赖障碍,能快速理解 GUI 核心机制;需转向 PySide6 的场景包括高 DPI 支持、嵌入网页/图表/视频、避免单线程阻塞;PySide6 因 LGPL 许可证和更稳的多线程支持优于 PyQt6;wxPython 仅在强需求原生控件时考虑。
初学者该从
还是
入手?
直接选
——不是因为它“最好”,而是它不设门槛:装完 Python 就能跑,
一写,窗口就出来。你不用查许可证、不用配 Qt Designer、不会遇到
这类拦路错误。
但得说清楚:这不是“推荐长期用”,而是“推荐先用来搞懂 GUI 是怎么动起来的”。它的事件循环机制、组件生命周期、布局逻辑(
/
/
)和回调绑定方式,和所有主流框架底层逻辑一致。练熟了,转
或
只是换套 API,不是重学概念。
别一上来就折腾
的信号槽(
),容易卡在“为什么函数没被调用”上——Tkinter 的
更直白,出错也容易定位
如果你要做的只是读个文件、填个表单、弹个提示框,
写 10 行就能交付;硬上
,光初始化
和
就要 6 行,还容易漏掉
导致程序退出异常
在 macOS 上默认字体发虚、Linux 下按钮太小、Windows 下样式陈旧——这不是 bug,是它本就不承诺现代 UI。别花时间改
去“美化”,那是在给自行车加涡轮
和
到底选哪个?
现在(2026 年)闭眼选
——它和
功能几乎完全同步,但许可证是 LGPL,商用无隐忧;而
的 GPL 协议要求你开源整个应用,除非你买商业许可,否则真踩雷。
两者 API 高度兼容,但细节有坑:
立即学习
“
Python免费学习笔记(深入)
”;
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
导入路径不同:
vs
,混用会直接报错,不能靠改 alias 蒙混过关
对 Python 3.9+ 支持更稳,尤其在多线程更新 UI(比如用
+
)时,崩溃概率比
低
Qt Designer 生成的
文件,用
编译,别用
,否则生成代码里会出现
特有的类名,运行时报
什么时候必须放弃
,切到
?
当你开始为以下任一需求写第二行代码时,就该切了:
需要高 DPI 屏幕下文字/图标清晰显示(
的缩放支持是模拟的,模糊;
原生支持
)
界面里要嵌入网页(
)、图表(
)、视频流(
)——这些在
里要么没有,要么得靠
启外部进程,交互断裂
用户抱怨“按钮点不动”“输入框卡住”——这往往是
单线程模型下,耗时操作(如网络请求、大文件解析)阻塞了
;
提供成熟的线程通信机制(
/
),能真正解耦
还值得考虑吗?
只在一种场景下值得:你要做一个看起来“就是 Windows 原生”或“就是 macOS 原生”的工具,且目标用户对 UI 一致性极其敏感(比如给医院信息科写的内部系统)。
渲染的是真实系统控件,不是画出来的模拟品。
但代价明显:
安装麻烦:
不提供纯 Python wheel,Windows/macOS 都要编译本地扩展,
经常失败,得去官网下预编译包
文档零散,很多 API 示例还是 Python 2 写法,比如
中的
参数在新版里已被弃用,但老教程没更新
社区萎缩明显,GitHub 上近一年 issue 回复率低于 30%,遇到
这类错误,基本只能靠翻 2018 年的 Stack Overflow 答案碰运气
除非你明确知道“原生控件”是刚需,否则别把它放进初始选型清单——它不是备胎,是特需通道。
TkinterPyQtTkinterroot.mainloop()ModuleNotFoundError: No module named 'PyQt5'packgridplacePyQtPySidePyQt5button.clicked.connect(...)command=...TkinterPyQtQApplicationQWidgetsys.exit()Tkinterttk.StylePyQtPySidePySide6PyQt6PyQt6from PySide6.QtWidgets import QApplicationfrom PyQt6.QtWidgets import QApplicationPySide6QThreadmoveToThreadPyQt6.uipyside6-uicpyuic6PyQt6NameErrorTkinterPySide6TkinterPySide6Qt::AA_EnableHighDpiScalingQWebEngineViewQChartViewQVideoWidgetTkintersubprocessTkintermainloopPySide6QSignalMapperQMetaObject.invokeMethodwxPythonwxPythonwxPythonpip install wxpythonwx.Frame(None, title="")NoneAssertionError: Invalid window handle