Python桌面应用GUI库选型之Tkinter、Qt、Kivy、Flet等怎么选详解
作者:yuanpan
很多 Python 小伙伴学完基础语法之后,都会遇到一个很现实的问题:
我想把脚本做成一个能点按钮、填表单、选择文件、展示结果的桌面软件,到底该选哪个 GUI 库?
Python 能做桌面应用,但它的 GUI 生态不像 Web 那样有一个绝对统一的答案。不同库的设计目标差别很大:
- 有的适合做简单工具。
- 有的适合做企业级复杂软件。
- 有的适合移动端和触控界面。
- 有的适合数据监控、实时绘图、调试工具。
- 有的适合把 HTML/CSS/JavaScript 前端包进桌面窗口。
这篇文章不追求把每个库讲到很深,而是给大家一个“选型界面”:先快速判断自己适合哪条路线,再给每个主流方案一个最小可运行案例。
本文基于 2026-04-22 可访问的官方文档整理。GUI 库发展很快,正式项目落地前建议再核对一次版本、许可和打包方案。
一、先给结论:怎么选
| 场景 | 优先考虑 | 适合人群 | 简单评价 |
|---|---|---|---|
| 只想快速做一个小工具 | Tkinter | Python 初学者、内部脚本工具 | 标准库自带,安装成本最低 |
| 想做成熟、复杂、商业化桌面软件 | PySide6 / PyQt6 | 中高级开发者、企业工具开发 | 功能强,生态大,学习曲线也高 |
| 想要系统原生风格窗口 | wxPython | 传统桌面软件开发者 | 跨平台且偏原生体验 |
| 想同时考虑桌面和移动端 | Kivy | 触控应用、跨端原型 | UI 风格自成体系,适合自定义界面 |
| 想用 Python 写 Flutter 风格应用 | Flet | 想快速做现代跨端界面的开发者 | Python 调用 Flutter 体系,上手快 |
| 做实时工具、监控面板、调试器 | Dear PyGui | 工具链、图形调试、实时数据展示 | GPU 加速,控件和绘图能力强 |
| 已经有 Web 前端,想包成桌面应用 | pywebview | Web 前端 + Python 后端组合 | 类似轻量 Electron,不自带大型浏览器内核 |
| 想走 Python 原生跨平台应用路线 | Toga / BeeWare | 关注原生控件和多平台发布的人 | 项目理念好,适合关注 BeeWare 生态 |
如果你完全没有经验,我建议按这个顺序尝试:
- 入门练手:
Tkinter - 正式桌面软件:
PySide6 - Web 技术栈转桌面:
pywebview - 触控/移动端:
Kivy或Flet - 实时图表/调试工具:
Dear PyGui
二、选型时真正要关心什么
选 GUI 库时,不要只看“界面好不好看”。更重要的是下面这些问题:
- 是否跨平台:Windows、macOS、Linux 是否都要支持?
- 是否容易打包:能不能顺利打包成 exe、app、deb?
- 是否适合复杂界面:表格、树形控件、菜单、工具栏、拖拽、绘图是否好做?
- 是否适合商业项目:开源协议和商业授权是否允许你的使用方式?
- 是否容易维护:文档、社区、示例、版本更新是否稳定?
- 团队会什么:团队更熟 Python 控件,还是更熟 HTML/CSS/JS?
很多项目失败不是因为 GUI 库不够强,而是一开始选了和团队能力、产品形态不匹配的路线。
三、Tkinter:标准库自带,适合小工具和入门
Tkinter 是 Python 标准库里的 GUI 方案。Python 官方文档说明,tkinter 是 Python 面向 Tcl/Tk GUI 工具包的标准接口,大多数 Python 安装环境都可以直接使用。
优点:
- 不需要额外安装第三方库。
- 入门成本低。
- 很适合写配置工具、批处理工具、文件处理工具。
ttk组件能让界面比传统 Tk 控件更现代一点。
缺点:
- 默认视觉效果比较朴素。
- 做复杂大型软件时,代码组织和界面能力会吃力。
- 高级控件和现代交互需要自己补很多东西。
安装:
# 通常不需要安装,直接使用 Python 自带的 tkinter python -m tkinter
最小案例:
import tkinter as tk
from tkinter import ttk, messagebox
def say_hello():
name = name_var.get().strip() or "Python 开发者"
messagebox.showinfo("提示", f"你好,{name}!")
root = tk.Tk()
root.title("Tkinter 小工具")
root.geometry("320x160")
frame = ttk.Frame(root, padding=16)
frame.pack(fill="both", expand=True)
ttk.Label(frame, text="请输入名字:").pack(anchor="w")
name_var = tk.StringVar()
ttk.Entry(frame, textvariable=name_var).pack(fill="x", pady=8)
ttk.Button(frame, text="打招呼", command=say_hello).pack(anchor="e")
root.mainloop()
适合做什么:
- Excel/CSV 处理工具
- 文件批量改名工具
- 简单配置面板
- 学习 GUI 编程基础
不太适合:
- 复杂商业软件
- 高度定制的现代 UI
- 大型数据表格和复杂交互
四、PySide6 / PyQt6:Qt 系,适合正式桌面软件
Qt 是非常成熟的跨平台 GUI 框架。Python 里常见的 Qt 方案主要有两个:
PySide6:Qt 官方维护的 Python 绑定,也叫 Qt for Python。PyQt6:Riverbank Computing 维护的 Qt Python 绑定。
官方 Qt for Python 文档说明,PySide6 可以让你在 Python 应用中使用 Qt6 API。Qt 系的能力很完整:窗口、菜单、工具栏、表格、树、绘图、WebView、模型视图、国际化、主题、资源系统等都比较成熟。
优点:
- 功能非常完整。
- 适合复杂业务软件。
- 文档、示例、社区资料多。
- 可以用 Qt Designer 设计界面。
- 商业软件、工业软件、内部工具都常见。
缺点:
- 学习曲线比 Tkinter 高。
- 打包体积通常更大。
- 信号槽、事件循环、模型视图等概念需要认真学。
- PySide6 和 PyQt6 的授权方式不同,商业项目必须提前确认许可。
选 PySide6 还是 PyQt6:
| 选项 | 建议 |
|---|---|
| 新项目、不确定授权 | 优先看 PySide6 |
| 已有 PyQt 项目 | 继续用 PyQt6 / PyQt5,但确认许可 |
| 需要商业闭源发布 | 一定提前核对 Qt、PySide6、PyQt6 的授权条款 |
安装:
pip install pyside6
PySide6 最小案例:
import sys
from PySide6.QtWidgets import QApplication, QLabel, QMainWindow, QPushButton, QVBoxLayout, QWidget
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("PySide6 桌面应用")
self.resize(360, 180)
self.label = QLabel("点击按钮开始")
button = QPushButton("运行任务")
button.clicked.connect(self.on_click)
layout = QVBoxLayout()
layout.addWidget(self.label)
layout.addWidget(button)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
def on_click(self):
self.label.setText("任务已经执行完成")
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
如果使用 PyQt6,代码结构基本相似,主要是导入路径不同:
import sys
from PyQt6.QtWidgets import QApplication, QLabel, QMainWindow, QPushButton, QVBoxLayout, QWidget
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("PyQt6 桌面应用")
self.label = QLabel("Hello PyQt6")
button = QPushButton("点击")
button.clicked.connect(lambda: self.label.setText("按钮已点击"))
layout = QVBoxLayout()
layout.addWidget(self.label)
layout.addWidget(button)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())适合做什么:
- 企业内部管理工具
- 工业控制软件
- 数据分析客户端
- 图像处理软件
- 复杂配置平台
不太适合:
- 只写一个非常简单的小脚本窗口
- 完全不想学习 GUI 架构的新手
五、wxPython:偏系统原生体验的传统桌面方案
wxPython 是 wxWidgets 的 Python 封装。wxPython 官网说明,它可以让 Python 应用在 Windows、macOS、Linux 等系统上创建接近原生的用户界面。
优点:
- 系统原生感较强。
- 桌面控件比较完整。
- 适合传统桌面应用。
- 跨平台能力成熟。
缺点:
- 社区热度不如 Qt。
- 文档和学习资料相对分散。
- UI 写法对新手不如 Tkinter 直观。
安装:
pip install wxpython
最小案例:
import wx
class MainFrame(wx.Frame):
def __init__(self):
super().__init__(parent=None, title="wxPython 桌面应用", size=(360, 180))
panel = wx.Panel(self)
box = wx.BoxSizer(wx.VERTICAL)
self.label = wx.StaticText(panel, label="点击按钮开始")
button = wx.Button(panel, label="运行任务")
button.Bind(wx.EVT_BUTTON, self.on_click)
box.Add(self.label, flag=wx.ALL, border=12)
box.Add(button, flag=wx.ALL, border=12)
panel.SetSizer(box)
def on_click(self, event):
self.label.SetLabel("任务已经执行完成")
app = wx.App()
frame = MainFrame()
frame.Show()
app.MainLoop()适合做什么:
- 传统 Windows/macOS/Linux 工具
- 希望界面更接近系统原生风格的软件
- 中等复杂度桌面应用
不太适合:
- 想要非常现代、动画丰富的界面
- 想找大量中文新手教程
六、Kivy:适合触控、自定义 UI 和移动端
Kivy 官网把自己定位为开源 Python 应用开发框架,可以使用一套代码部署到 Windows、Linux、macOS、iOS、Android 等平台。
优点:
- 跨桌面和移动端。
- 适合触控界面、多点触控、自定义控件。
- UI 风格自由,不依赖系统原生控件。
- MIT License,商业使用相对友好。
缺点:
- 默认界面不是传统系统原生风格。
- 学习 Kivy 的布局、属性、事件机制需要时间。
- 如果只做普通办公软件,可能不是最省事的选择。
安装:
pip install "kivy[base]"
最小案例:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
class DemoApp(App):
def build(self):
layout = BoxLayout(orientation="vertical", padding=20, spacing=12)
label = Label(text="点击按钮开始")
button = Button(text="运行任务", size_hint=(1, 0.3))
def on_press(instance):
label.text = "任务已经执行完成"
button.bind(on_press=on_press)
layout.add_widget(label)
layout.add_widget(button)
return layout
DemoApp().run()适合做什么:
- 触控屏应用
- 展示大屏
- 移动端原型
- 自定义风格强的工具
不太适合:
- 想要 Windows 原生控件风格
- 传统表单、表格、菜单很多的企业软件
七、Flet:用 Python 写 Flutter 风格跨端应用
Flet 官方文档说明,它允许开发者用 Python 构建 Web、桌面和移动应用,不需要事先掌握前端开发。它底层基于 Flutter,界面风格现代,上手体验比较友好。
优点:
- 写法简洁,入门快。
- 支持桌面、Web、移动端。
- UI 视觉比较现代。
- 对不想写 JavaScript/Flutter/Dart 的 Python 开发者友好。
缺点:
- 项目长期稳定性要看 Flet 生态发展。
- 复杂原生桌面能力不如 Qt。
- 对底层 Flutter 机制不了解时,遇到复杂问题排查成本会变高。
安装:
pip install "flet[all]"
最小案例:
import flet as ft
def main(page: ft.Page):
page.title = "Flet 桌面应用"
page.window_width = 360
page.window_height = 220
result = ft.Text("点击按钮开始")
def run_task(e):
result.value = "任务已经执行完成"
page.update()
page.add(
ft.Column(
controls=[
result,
ft.ElevatedButton("运行任务", on_click=run_task),
],
spacing=16,
)
)
ft.run(main)运行:
flet run app.py
适合做什么:
- 快速原型
- 现代风格工具
- 想同时尝试 Web/桌面/移动端的应用
- 数据录入、管理面板、轻量客户端
不太适合:
- 高度依赖系统原生控件的桌面软件
- 需要深度操作系统集成的复杂客户端
八、Dear PyGui:适合实时工具、监控面板和调试器
Dear PyGui 官方文档介绍它是一个易用、动态、GPU 加速、跨平台的 Python GUI 工具包,内置按钮、单选框、菜单、布局、绘图、表格等能力。
优点:
- 性能好,适合实时刷新。
- 很适合做调试工具、仪表盘、开发者工具。
- 绘图、表格、资源查看等能力比较突出。
- 代码量较少,上手速度快。
缺点:
- UI 风格更偏工具化,不是传统业务软件风格。
- 不适合做特别强调系统原生体验的软件。
- 大型业务应用的组织方式需要自己设计。
安装:
pip install dearpygui
最小案例:
from dearpygui import dearpygui as dpg
def run_task():
dpg.set_value("result_text", "任务已经执行完成")
dpg.create_context()
with dpg.window(label="Dear PyGui 桌面应用", width=360, height=180):
dpg.add_text("点击按钮开始", tag="result_text")
dpg.add_button(label="运行任务", callback=run_task)
dpg.create_viewport(title="Dear PyGui Demo", width=420, height=240)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()适合做什么:
- 实时数据监控
- 算法调试面板
- 图形工具
- 游戏/引擎编辑器辅助工具
- 设备状态仪表盘
不太适合:
- 普通办公类 CRUD 软件
- 对系统原生风格要求很高的软件
九、pywebview:把 Web 页面装进原生窗口
pywebview 官方文档说明,它是一个轻量 native webview wrapper,可以在原生 GUI 窗口里显示 HTML 内容。它可以让你用 Web 技术写界面,同时用 Python 做本地能力和后端逻辑。
它有点像轻量 Electron,但默认不打包一个大型浏览器内核,而是使用系统提供的 WebView 能力。
优点:
- 前端同学非常容易上手。
- 可以复用 HTML/CSS/JavaScript 生态。
- Python 与 JavaScript 可以双向通信。
- 比 Electron 更轻一些。
缺点:
- 依赖系统 WebView,跨平台表现要测试。
- 桌面原生控件能力不是重点。
- 安全边界、前后端通信需要设计好。
安装:
pip install pywebview
最小案例:
import webview
class Api:
def greet(self, name):
return f"你好,{name or 'Python 开发者'}!"
html = """
<!doctype html>
<html>
<body style="font-family: sans-serif; padding: 24px;">
<h2>pywebview 桌面应用</h2>
<input id="name" placeholder="请输入名字" />
<button onclick="sayHello()">打招呼</button>
<p id="result">等待操作</p>
<script>
async function sayHello() {
const name = document.getElementById("name").value;
const message = await pywebview.api.greet(name);
document.getElementById("result").innerText = message;
}
</script>
</body>
</html>
"""
window = webview.create_window("pywebview 示例", html=html, js_api=Api())
webview.start()
适合做什么:
- 已经有 Web 前端的项目
- 想把本地 Python 能力包装成桌面工具
- 后台是 Python,界面交给 HTML/CSS/JS
- 轻量客户端
不太适合:
- 完全不懂前端的 Python 初学者
- 对系统原生桌面控件有强需求的软件
十、Toga / BeeWare:Python 原生跨平台应用路线
Toga 是 BeeWare 生态的一部分。官方文档介绍它是 Python native、OS native、cross-platform 的 GUI 工具包,目标是用统一接口写跨平台原生应用。
优点:
- 理念清晰:Python 原生、系统原生、跨平台。
- BeeWare 生态关注应用打包和发布。
- 支持桌面、移动端、Web 等多个目标。
缺点:
- 相比 Qt、Tkinter,中文资料和项目案例少。
- 复杂项目落地前要充分验证控件能力。
- 如果追求最稳妥的企业桌面方案,Qt 仍然更常见。
安装:
pip install toga
最小案例:
import toga
from toga.style import Pack
from toga.style.pack import COLUMN
class DemoApp(toga.App):
def startup(self):
self.label = toga.Label("点击按钮开始")
button = toga.Button("运行任务", on_press=self.run_task)
box = toga.Box(
children=[self.label, button],
style=Pack(direction=COLUMN, padding=20),
)
self.main_window = toga.MainWindow(title="Toga 桌面应用")
self.main_window.content = box
self.main_window.show()
def run_task(self, widget):
self.label.text = "任务已经执行完成"
def main():
return DemoApp("Toga Demo", "com.example.togademo")
if __name__ == "__main__":
main().main_loop()
适合做什么:
- 想关注 BeeWare 生态的跨平台 Python 应用
- 希望尽量使用原生控件
- 愿意尝试 Python 原生应用发布路线的项目
不太适合:
- 追求资料最多、坑最少的商业桌面项目
- 需要大量复杂控件且工期很紧的项目
十一、一个更实用的决策树
可以按下面这个思路选:
只是做一个简单窗口? -> Tkinter 要做长期维护的复杂桌面软件? -> PySide6 / PyQt6 团队有 Web 前端经验? -> pywebview 需要触控、移动端或自定义视觉? -> Kivy / Flet 需要实时图表、监控面板、调试工具? -> Dear PyGui 希望系统原生风格,并且项目复杂度中等? -> wxPython 想研究 Python 原生跨平台发布? -> Toga / BeeWare
十二、打包发布也要提前考虑
写 GUI 程序只是第一步,真正交付给别人时还要打包。
常见打包工具:
PyInstaller:最常见,适合很多 Python 桌面应用。Nuitka:会把 Python 编译成 C/C++ 再构建,适合追求性能和保护源码的场景。cx_Freeze:传统打包工具,也可用于桌面应用。Briefcase:BeeWare 生态工具,常和 Toga 配合。- Flet/Kivy/Qt 自己也有各自推荐的发布方式。
建议在项目早期就做一次最小打包验证,不要等功能全部写完才发现依赖、资源文件、动态库、WebView 运行时、字体、图片路径都有问题。
十三、我的个人建议
如果你是 Python 初学者:
- 先用
Tkinter写 2 到 3 个小工具。 - 理解窗口、控件、布局、事件绑定。
- 再学习
PySide6,它更适合做正式桌面软件。
如果你要做公司内部工具:
- 简单工具:
Tkinter - 中大型工具:
PySide6 - 已有前端页面:
pywebview
如果你要做数据/算法/设备相关工具:
- 普通业务界面:
PySide6 - 实时曲线、调试面板:
Dear PyGui - 触控屏、大屏展示:
Kivy
如果你要做跨端现代界面:
- 快速原型:
Flet - 自定义触控界面:
Kivy - 原生跨平台探索:
Toga
十四、总结
Python 桌面应用没有唯一标准答案。选型的核心不是“哪个库最强”,而是“哪个库最适合你的项目形态”。
简单总结:
| 库 | 一句话建议 |
|---|---|
| Tkinter | 最适合入门和简单工具 |
| PySide6 / PyQt6 | 最适合正式、复杂、长期维护的桌面软件 |
| wxPython | 适合偏系统原生风格的传统桌面应用 |
| Kivy | 适合触控、移动端和自定义 UI |
| Flet | 适合快速写现代跨端应用 |
| Dear PyGui | 适合实时工具、监控面板、调试器 |
| pywebview | 适合 Web 技术栈包装桌面客户端 |
| Toga | 适合探索 Python 原生跨平台应用路线 |
新手不要一开始就纠结太久。最好的方式是选 1 到 2 个方向,各写一个小 demo,再根据实际打包、界面复杂度、团队能力和维护周期做决定。
参考资料
- Python 官方文档:tkinter — Python interface to Tcl/Tk
https://docs.python.org/3/library/tkinter.html - Qt for Python 官方文档
https://doc.qt.io/qtforpython-6/ - Riverbank Computing:PyQt
https://www.riverbankcomputing.com/software/pyqt - wxPython 官网
https://wxpython.org/ - Kivy 官网
https://kivy.org/ - Flet 官方文档
https://flet.dev/docs/ - Dear PyGui 官方文档
https://dearpygui.readthedocs.io/ - pywebview 官方文档
https://pywebview.idepy.com/en/guide/ - Toga 官方文档
https://toga.beeware.org/
到此这篇关于Python桌面应用GUI库选型之Tkinter、Qt、Kivy、Flet等怎么选的文章就介绍到这了,更多相关Tkinter、Qt、Kivy、Flet怎么选内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
