Python GUI生态丰富,不同框架各有千秋。根据2023年JetBrains开发者调查,PyQt和Tkinter占据Python GUI开发前两位,但新兴框架(如Dear PyGui)增长迅猛。
框架 | 渲染方式 | 许可协议 | 学习曲线 | 应用场景 |
---|---|---|---|---|
PyQt5 | 原生+QSS | 商业/GPL | 陡峭 | 企业级复杂应用 |
wxPython | 原生控件 | LGPL | 中等 | 桌面办公软件 |
Kivy | OpenGL | MIT | 中等 | 移动/触屏应用 |
Dear PyGui | 即时模式 | MIT | 平缓 | 数据可视化仪表盘 |
Tkinter | Tcl/Tk | Python License | 简单 | 小型工具/原型开发 |
PySimpleGUI | 抽象封装层 | LGPL | 极简 | 快速开发验证 |
# 安装各框架核心包
pip install pyqt5 wxpython kivy dearpygui pysimplegui
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
from PyQt5.QtCore import Qt
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("PyQt5示例")
self.setGeometry(100, 100, 400, 300)
btn = QPushButton("带样式的按钮", self)
btn.setGeometry(50, 50, 200, 40)
btn.setStyleSheet("""
QPushButton {
background-color: #4CAF50;
border: none;
color: white;
padding: 10px;
border-radius: 5px;
}
QPushButton:hover {
background-color: #45a049;
}
""")
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
import wx
class FileManager(wx.Frame):
def __init__(self):
super().__init__(None, title="wxPython文件管理器")
panel = wx.Panel(self)
self.dir_picker = wx.DirPickerCtrl(panel)
self.list_ctrl = wx.ListCtrl(panel, style=wx.LC_REPORT)
self.list_ctrl.AppendColumn("文件名", width=200)
self.list_ctrl.AppendColumn("大小", width=100)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.dir_picker, 0, wx.EXPAND|wx.ALL, 5)
sizer.Add(self.list_ctrl, 1, wx.EXPAND|wx.ALL, 5)
panel.SetSizer(sizer)
self.Show()
if __name__ == "__main__":
app = wx.App()
FileManager()
app.MainLoop()
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.switch import Switch
class MobileApp(App):
def build(self):
layout = BoxLayout(orientation='vertical', spacing=10, padding=20)
btn = Button(text='移动风格按钮', size_hint=(1, 0.2))
switch = Switch(active=False)
layout.add_widget(btn)
layout.add_widget(switch)
return layout
MobileApp().run()
import dearpygui.dearpygui as dpg
dpg.create_context()
def update_data():
dpg.set_value("plot", [[i for i in range(10)],
[random.random() for _ in range(10)]])
with dpg.window(label="实时仪表盘"):
dpg.add_button(label="更新数据", callback=update_data)
dpg.add_plot(label="动态曲线", height=300, width=500)
dpg.add_line_series([], [], parent="动态曲线", tag="plot")
dpg.create_viewport(title='Dear PyGui Demo', width=800, height=600)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()
框架 | 启动时间(ms) | 内存占用(MB) | 平均FPS |
---|---|---|---|
PyQt5 | 450 | 85 | 58 |
wxPython | 320 | 92 | 45 |
Kivy | 680 | 120 | 60 |
Dear PyGui | 220 | 65 | 120 |
Tkinter | 180 | 40 | 30 |
Dear PyGui在渲染性能上表现突出,适合数据可视化场景;Tkinter保持最低资源占用,适合简单工具开发。
# 打印所有信号触发
btn.clicked.connect(lambda: print("按钮被点击"))
kivy -m inspector # 启动调试器
框架 | 核心工具 |
---|---|
PyQt5 | Qt Designer/ PyInstaller |
wxPython | XRC编辑器/ wxFormBuilder |
Kivy | KivyMD设计语言/ Buildozer |
Dear PyGui | ImPlot可视化库/ AsyncIO集成 |
“选择GUI框架就像选择交通工具,去隔壁用自行车,跨大陆用飞机,关键要匹配场景需求。”
—— Python GUI开发箴言
扩展学习建议:
# 各框架Hello World快速体验
pip install pyqt5 wxpython kivy dearpygui
python -c "from PyQt5.QtWidgets import *; app = QApplication([]); QLabel('Hello Qt').show(); app.exec_()"
python -c "import wx; app = wx.App(); wx.Frame(None, title='Hello wx').Show(); app.MainLoop()"
python -c "from kivy.app import runTouchApp; from kivy.uix.label import Label; runTouchApp(Label(text='Hello Kivy'))"