python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Tkinter、Qt、Kivy、Flet怎么选

Python桌面应用GUI库选型之Tkinter、Qt、Kivy、Flet等怎么选详解

作者:yuanpan

在移动应用开发 领域,Python正以惊人的速度改变着游戏规则,这篇文章主要介绍了Python桌面应用GUI库选型之Tkinter、Qt、Kivy、Flet等怎么选的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

很多 Python 小伙伴学完基础语法之后,都会遇到一个很现实的问题:

我想把脚本做成一个能点按钮、填表单、选择文件、展示结果的桌面软件,到底该选哪个 GUI 库?

Python 能做桌面应用,但它的 GUI 生态不像 Web 那样有一个绝对统一的答案。不同库的设计目标差别很大:

这篇文章不追求把每个库讲到很深,而是给大家一个“选型界面”:先快速判断自己适合哪条路线,再给每个主流方案一个最小可运行案例。

本文基于 2026-04-22 可访问的官方文档整理。GUI 库发展很快,正式项目落地前建议再核对一次版本、许可和打包方案。

一、先给结论:怎么选

场景优先考虑适合人群简单评价
只想快速做一个小工具TkinterPython 初学者、内部脚本工具标准库自带,安装成本最低
想做成熟、复杂、商业化桌面软件PySide6 / PyQt6中高级开发者、企业工具开发功能强,生态大,学习曲线也高
想要系统原生风格窗口wxPython传统桌面软件开发者跨平台且偏原生体验
想同时考虑桌面和移动端Kivy触控应用、跨端原型UI 风格自成体系,适合自定义界面
想用 Python 写 Flutter 风格应用Flet想快速做现代跨端界面的开发者Python 调用 Flutter 体系,上手快
做实时工具、监控面板、调试器Dear PyGui工具链、图形调试、实时数据展示GPU 加速,控件和绘图能力强
已经有 Web 前端,想包成桌面应用pywebviewWeb 前端 + Python 后端组合类似轻量 Electron,不自带大型浏览器内核
想走 Python 原生跨平台应用路线Toga / BeeWare关注原生控件和多平台发布的人项目理念好,适合关注 BeeWare 生态

如果你完全没有经验,我建议按这个顺序尝试:

  1. 入门练手:Tkinter
  2. 正式桌面软件:PySide6
  3. Web 技术栈转桌面:pywebview
  4. 触控/移动端:KivyFlet
  5. 实时图表/调试工具:Dear PyGui

二、选型时真正要关心什么

选 GUI 库时,不要只看“界面好不好看”。更重要的是下面这些问题:

  1. 是否跨平台:Windows、macOS、Linux 是否都要支持?
  2. 是否容易打包:能不能顺利打包成 exe、app、deb?
  3. 是否适合复杂界面:表格、树形控件、菜单、工具栏、拖拽、绘图是否好做?
  4. 是否适合商业项目:开源协议和商业授权是否允许你的使用方式?
  5. 是否容易维护:文档、社区、示例、版本更新是否稳定?
  6. 团队会什么:团队更熟 Python 控件,还是更熟 HTML/CSS/JS?

很多项目失败不是因为 GUI 库不够强,而是一开始选了和团队能力、产品形态不匹配的路线。

三、Tkinter:标准库自带,适合小工具和入门

Tkinter 是 Python 标准库里的 GUI 方案。Python 官方文档说明,tkinter 是 Python 面向 Tcl/Tk GUI 工具包的标准接口,大多数 Python 安装环境都可以直接使用。

优点:

缺点:

安装:

# 通常不需要安装,直接使用 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()

适合做什么:

不太适合:

四、PySide6 / PyQt6:Qt 系,适合正式桌面软件

Qt 是非常成熟的跨平台 GUI 框架。Python 里常见的 Qt 方案主要有两个:

官方 Qt for Python 文档说明,PySide6 可以让你在 Python 应用中使用 Qt6 API。Qt 系的能力很完整:窗口、菜单、工具栏、表格、树、绘图、WebView、模型视图、国际化、主题、资源系统等都比较成熟。

优点:

缺点:

选 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())

适合做什么:

不太适合:

五、wxPython:偏系统原生体验的传统桌面方案

wxPython 是 wxWidgets 的 Python 封装。wxPython 官网说明,它可以让 Python 应用在 Windows、macOS、Linux 等系统上创建接近原生的用户界面。

优点:

缺点:

安装:

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()

适合做什么:

不太适合:

六、Kivy:适合触控、自定义 UI 和移动端

Kivy 官网把自己定位为开源 Python 应用开发框架,可以使用一套代码部署到 Windows、Linux、macOS、iOS、Android 等平台。

优点:

缺点:

安装:

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()

适合做什么:

不太适合:

七、Flet:用 Python 写 Flutter 风格跨端应用

Flet 官方文档说明,它允许开发者用 Python 构建 Web、桌面和移动应用,不需要事先掌握前端开发。它底层基于 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

适合做什么:

不太适合:

八、Dear PyGui:适合实时工具、监控面板和调试器

Dear PyGui 官方文档介绍它是一个易用、动态、GPU 加速、跨平台的 Python GUI 工具包,内置按钮、单选框、菜单、布局、绘图、表格等能力。

优点:

缺点:

安装:

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()

适合做什么:

不太适合:

九、pywebview:把 Web 页面装进原生窗口

pywebview 官方文档说明,它是一个轻量 native webview wrapper,可以在原生 GUI 窗口里显示 HTML 内容。它可以让你用 Web 技术写界面,同时用 Python 做本地能力和后端逻辑。

它有点像轻量 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()

适合做什么:

不太适合:

十、Toga / BeeWare:Python 原生跨平台应用路线

Toga 是 BeeWare 生态的一部分。官方文档介绍它是 Python native、OS native、cross-platform 的 GUI 工具包,目标是用统一接口写跨平台原生应用。

优点:

缺点:

安装:

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()

适合做什么:

不太适合:

十一、一个更实用的决策树

可以按下面这个思路选:

只是做一个简单窗口?
  -> Tkinter

要做长期维护的复杂桌面软件?
  -> PySide6 / PyQt6

团队有 Web 前端经验?
  -> pywebview

需要触控、移动端或自定义视觉?
  -> Kivy / Flet

需要实时图表、监控面板、调试工具?
  -> Dear PyGui

希望系统原生风格,并且项目复杂度中等?
  -> wxPython

想研究 Python 原生跨平台发布?
  -> Toga / BeeWare

十二、打包发布也要提前考虑

写 GUI 程序只是第一步,真正交付给别人时还要打包。

常见打包工具:

建议在项目早期就做一次最小打包验证,不要等功能全部写完才发现依赖、资源文件、动态库、WebView 运行时、字体、图片路径都有问题。

十三、我的个人建议

如果你是 Python 初学者:

如果你要做公司内部工具:

如果你要做数据/算法/设备相关工具:

如果你要做跨端现代界面:

十四、总结

Python 桌面应用没有唯一标准答案。选型的核心不是“哪个库最强”,而是“哪个库最适合你的项目形态”。

简单总结:

一句话建议
Tkinter最适合入门和简单工具
PySide6 / PyQt6最适合正式、复杂、长期维护的桌面软件
wxPython适合偏系统原生风格的传统桌面应用
Kivy适合触控、移动端和自定义 UI
Flet适合快速写现代跨端应用
Dear PyGui适合实时工具、监控面板、调试器
pywebview适合 Web 技术栈包装桌面客户端
Toga适合探索 Python 原生跨平台应用路线

新手不要一开始就纠结太久。最好的方式是选 1 到 2 个方向,各写一个小 demo,再根据实际打包、界面复杂度、团队能力和维护周期做决定。

参考资料

到此这篇关于Python桌面应用GUI库选型之Tkinter、Qt、Kivy、Flet等怎么选的文章就介绍到这了,更多相关Tkinter、Qt、Kivy、Flet怎么选内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文