有人问,为什么很多Python开发者写GUI不用Tkinter,而要选择PyQt和wxPython或其他?
为什么不用Tkinter?其实根本原因在于Tkinter和PyQt、wxPython完全不是一类产品,不是说它不是GUI库,而是它们的应用场景不一样。
Tkinter就像是一个随拿随用的小工具箱,你用它做个小板凳、小椅子是可以的,但不能指望它造汽车,而PyQt、wxPython则像一个大型制造车间,工具齐全、流程完善,汽车飞机大炮都可以造。
Tkinter是Python的内置GUI库,你想想看Python安装包才几十兆,Tkinter能有多大能耐?它存在的优势在于可以很快的创建原型,比如搭个简单的性能监测页面、计算器、输入表单等,因为它不需要环境配置、没有依赖库、API少且简单、启动速度快,所以制作demo级GUI更加得心应手。
如果要开发游戏、商业软件、高级控件,Tkinter就不适合了,因为Tkinter天生控件样式少且老旧,缺乏高级组建、布局设计有点繁琐、而且渲染复杂多媒体文件很吃力,所以就不适合开发逼格高的GUI软件了。这一切不是Tkinter不行,本身就是踢业余联赛的,没必要去对比英超西甲。
比如说做个简单的温度显示器,接入家里温度传感器的数值,在电脑上显示实时温度,如果超过28度显示红色,低于则显示绿色,这种页面简单的就可以用Tkinter来做。
import tkinter as tk
from tkinter import ttk
class SensorMonitor:
def __init__(self):
self.root = tk.Tk()
self.root.title("家庭温度监测仪表盘")
# 实时数值标签
self.temp_var = tk.StringVar(value="25.0℃")
tk.Label(self.root, textvariable=self.temp_var, font=("Arial", 24)).pack(pady=20)
# 状态指示灯,根据温度显示“红色”或者“绿色
self.canvas = tk.Canvas(self.root, width=100, height=100)
self.canvas.pack()
self.indicator = self.canvas.create_oval(20, 20, 80, 80, fill="green")
# 控制按钮
ttk.Button(self.root, text="刷新数据", command=self.update_data).pack(pady=10)
def update_data(self):
import random
temp = round(random.uniform(22.0, 30.0), 1)
self.temp_var.set(f"{temp}℃")
color = "red" if temp > 28 else "green"
self.canvas.itemconfig(self.indicator, fill=color)
app = SensorMonitor()
app.root.mainloop()
这种小GUI应用不需要复杂的结构和UI,也就二三十行代码,Tkinter应付足以。
相比Tkinter,PyQt就像是个六边形战士,它是基于大名鼎鼎的Qt框架搭的Python接口,拥有完备的控件、模块、事件处理机制、系统主题、多媒体资源、API接口,而且由于底层是基于C++实现的,速度和稳定性也是一流水平,可以说能搭建任何现代化的GUI应用,不限于大型商业软件、工业应用等等。
比如说很著名的Autodesk、Adobe、OBS系列软件都是Qt它开发的,还有Python生态的中的Spyter IDE、Oranger、MeVisLab则是基于PyQt开发的,与Python结合的非常好。
PyQt也有它的劣势,因为功能强大,所以体积也很大,依赖库众多,PyQt作为第三方库需要额外安装,大概有三四百兆,如果你仅仅是开发的简单的GUI小应用,配置PyQt有点高射炮打蚊子,也得不偿失。
其次PyQt同样因为功能强大,API众多,学习时间成本挺高的,用之前需要好好熟悉它的架构和技巧,比如布局管理器、信号 (Signal)、槽 (Slot)等,不比Tkinter简单。
由于Qt是商业软件,所以用正版还需要购买商业许可,门槛不小的。
wxPython是基于wxWidgets的Python接口,基于C++开发,它也是传统的核心GUI工具,控件丰富,社区活跃,和PyQt类似,但没有PyQt好用。
wxPython的最大优势是夸平台能力强,尽可能地使用目标操作系统的原生控件,做Windows像Windows,做MacOS像MacOS。
说了这么多,是想表达没必要拿Tkinter和PyQt、wxPython去比,使用场景完全不一样,几乎是两类物种,各有各的存在价值。
最后附一张三者对比的明细表,供参考。