构建现代应用的9个Python GUI库
你是不是也觉得Python好是好,就是做个带界面的桌面应用太费劲了,是时候打破这个刻板印象了。如今的Python在GUI开发领域早就不是吴下阿蒙了。今天介绍的Python GUI库都可以打造炫酷的应用。
在此之前,我们先搞定一切的基础 —— 开发环境。项目一多,Python版本就成了个头疼事。老项目可能还跑在Python 2.7上,新项目又想用最新的3.12特性,来回切换环境能把人折腾死。
那就不得不安利ServBay了,它能一键安装和管理N个Python版本,支持从老掉牙的2.7到最新的3.14。不管是维护祖传代码,还是开发新项目,都不用再为Python版本兼容性问题挠头了。环境搞定了,咱们才能安心搞开发。

好了,言归正传,来看看有库能让我们的Python应用改头换面。
Tkinter - Python官方标配,无需安装的GUI库
只要安装了Python,就有了Tkinter。作为Python的原配,它最大的优点就是不用装,直接用。虽然界面看起来有点古早,但做点内部用的小工具、简单的管理界面,绝对是够用的。胜在稳定、轻量,而且资料多,遇到问题随便一搜就是一大把解决方案。
特点:
-
Python标准库成员,无需安装。
-
简单直接,上手快。
-
界面拥有内在美。
import tkinter as tk
from tkinter import messageboxdef show_greeting():messagebox.showinfo("问候", "你好,来自Tkinter的世界!")# 创建主窗口
window = tk.Tk()
window.title("我的第一个Tkinter应用")
window.geometry("300x150")# 创建一个按钮
greet_button = tk.Button(window, text="点我打个招呼", command=show_greeting)
greet_button.pack(pady=40)# 启动事件循环
window.mainloop()
PySimpleGUI - 简化GUI代码,界面开发更轻松
如果觉得Tkinter有点啰嗦,界面也不够好看,那可以试试PySimpleGUI。它把Tkinter(以及Qt, WxPython等)复杂的部分都包装起来了,用几行代码就能搭出一个看起来还不错的界面。它的逻辑非常直观,就是通过各种元素堆叠出一个布局,然后用一个事件循环来处理用户操作。
特点:
-
代码极其简洁,学习成本低。
-
是对其他GUI库的封装,颜值比原生Tkinter高不少。
-
适合快速开发简单的图形界面工具。
import PySimpleGUI as sg# 定义窗口布局
layout = [[sg.Text("请输入你的大名:")],[sg.InputText(key='-NAME-')],[sg.Button("确定"), sg.Button("退出")]
]# 创建窗口
window = sg.Window("PySimpleGUI 示例", layout)# 事件循环
while True:event, values = window.read()if event == sg.WIN_CLOSED or event == '退出':breakif event == '确定':sg.popup(f"你好, {values['-NAME-']}!")window.close()
Flet - 用Python驱动Flutter,构建跨平台精美UI
Flet就厉害了,它能用Python直接调用Google的Flutter引擎来构建UI,不用通过Dart语言,就能做出拥有Flutter级别精美UI和流畅动画的应用。更牛的是,它天生跨平台,一套代码可以跑在桌面、Web甚至手机上。
特点:
-
基于Flutter,UI精美,性能优秀。
-
真正的跨平台,Web、桌面、移动端通吃。
-
对于想尝试Flutter又不想学Dart的Pythonista来说是绝配。
import flet as ft
import timedef main(page: ft.Page):page.title = "Flet 计数器"page.vertical_alignment = ft.MainAxisAlignment.CENTERtxt_number = ft.TextField(value="0", text_align=ft.TextAlign.RIGHT, width=100)def minus_click(e):txt_number.value = str(int(txt_number.value) - 1)page.update()def plus_click(e):txt_number.value = str(int(txt_number.value) + 1)page.update()page.add(ft.Row([ft.IconButton(ft.icons.REMOVE, on_click=minus_click),txt_number,ft.IconButton(ft.icons.ADD, on_click=plus_click),],alignment=ft.MainAxisAlignment.CENTER,))ft.app(target=main)
NiceGUI - 用Python代码,构建现代化Web UI
NiceGUI的思路很巧妙。它在底层用了FastAPI和Vue.js这些成熟的Web技术,但把它们都藏起来了。只需要用Python写前端逻辑,它会自动生成一个漂亮的Web界面。这个界面既可以在浏览器里访问,也可以打包成一个独立的桌面应用。非常适合做数据看板、Web小工具这类应用。
特点:
-
只写Python,就能得到一个现代化的Web UI。
-
部署灵活,既是网站,也是桌面应用。
-
非常适合需要网络交互和漂亮UI的内部工具。
from nicegui import uidef handle_greet():ui.notify(f'你好啊, {name_input.value}!')ui.label('请输入你的名字:')
name_input = ui.input(placeholder='在这里输入...')
ui.button('打招呼', on_click=handle_greet)ui.run()
PyWebview - 将现有Web技术打包成轻量级桌面应用
如果你本身就是个前端高手,熟悉HTML/CSS/JS,那么PyWebview简直是为你量身定做的,买它!它能创建一个轻量级的原生窗口,然后在里面加载Web页面。和重量级的Electron不同,它用的是操作系统自带的WebView控件,所以打包出来的应用体积非常小。Python和JavaScript之间还能互相调用函数,实现前后端交互。
特点:
-
极其轻量,打包体积小。
-
充分利用已有的Web开发技能。
-
Python与JS双向通信,灵活性高。
import webview
import threading
import timedef background_task(window):"""一个在后台运行的Python函数,可以与JS交互"""time.sleep(5)window.evaluate_js('alert("Python在5秒后向你问好!");')if __name__ == '__main__':window = webview.create_window('PyWebview 示例',html='<h1>这是一个本地HTML内容</h1><p>等待Python的消息...</p>')# 启动后台线程thread = threading.Thread(target=background_task, args=(window,))thread.start()webview.start()
Dear PyGui - GPU加速,为高性能数据可视化而生
Dear PyGui是个狼灭,直接使用GPU进行渲染,性能炸裂,就像游戏引擎里的UI系统一样。这使得它在处理需要高速刷新、数据量巨大的场景时(比如数据可视化、实时图表、开发工具)游刃有余。它的API是立即模式(Immediate Mode),写法和传统GUI有点不一样,但习惯了之后会觉得非常直观。
特点:
-
GPU加速,性能超强。
-
非常适合数据密集型应用和开发工具。
-
独特的立即模式API。
import dearpygui.dearpygui as dpgdpg.create_context()def save_callback(sender, app_data):user_input = dpg.get_value("input_text")print(f"用户输入的内容是: {user_input}")dpg.set_value("output_text", f"已保存: {user_input}")with dpg.window(label="Dear PyGui 示例", width=400, height=200):dpg.add_input_text(label="输入点什么", tag="input_text")dpg.add_button(label="保存", callback=save_callback)dpg.add_text("", tag="output_text")dpg.create_viewport(title='我的应用', width=420, height=240)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()
Kivy - 为多点触控设计的跨平台框架
Kivy从设计之初就考虑了多点触控。它的目标是“一次编码,处处运行”,尤其擅长在Windows, macOS, Linux, Android和iOS上构建应用。它有自己的一套UI渲染引擎,不依赖原生控件,所以能保证在所有平台上的外观和行为都完全一致。如果你想用Python开发一个手机App或者触摸屏应用,Kivy绝对是首选之一。
特点:
-
专为触摸屏和多点触控设计。
-
强大的跨平台能力,尤其是在移动端。
-
UI外观在所有平台保持一致。
from kivy.app import App
from kivy.uix.button import Buttonclass MyApp(App):def build(self):return Button(text='这是一个Kivy按钮',font_size='24sp',on_press=self.btn_press)def btn_press(self, instance):instance.text = '我被按了一下!'if __name__ == '__main__':MyApp().run()
Toga - 使用系统原生控件的跨平台GUI库
Toga是BeeWare项目的一部分,它的哲学和Kivy正好相反。Toga追求的是在每个平台上都使用系统原生的UI控件。这意味着你的应用在Windows上看起来就像个标准的Windows程序,在macOS上就有地道的macOS范儿。这种方式能给用户带来最熟悉、最亲切的操作体验。
特点:
-
使用平台原生控件,用户体验好。
-
BeeWare套件的一部分,生态完整。
-
跨平台,但追求平台原生外观。
import toga
from toga.style import Pack
from toga.style.pack import COLUMN, ROWclass TogaApp(toga.App):def startup(self):main_box = toga.Box(style=Pack(direction=COLUMN))name_label = toga.Label("你的名字: ", style=Pack(padding=(0, 5)))self.name_input = toga.TextInput(style=Pack(flex=1))name_box = toga.Box(style=Pack(direction=ROW, padding=5))name_box.add(name_label)name_box.add(self.name_input)button = toga.Button("打个招呼",on_press=self.say_hello,style=Pack(padding=5))main_box.add(name_box)main_box.add(button)self.main_window = toga.MainWindow(title=self.formal_name)self.main_window.content = main_boxself.main_window.show()def say_hello(self, widget):self.main_window.info_dialog('问候',f'你好, {self.name_input.value}')def main():return TogaApp('你好 Toga', 'org.example.hellotoga')if __name__ == '__main__':main().main_loop()
Gooey - 一键将命令行程序转换成GUI应用
最后这个Gooey,思路清奇。它不是让你从头写一个GUI,而是把你现成的命令行工具(CLI)一键变成一个GUI应用。你只需要在你的主函数上加一个装饰器,它就能自动根据你的argparse参数定义,生成一个简单明了的图形界面。对于那些写了很多命令行工具,又想让非技术人员也能轻松使用的开发者来说,这简直是天降神器。
特点:
-
将命令行程序秒变GUI。
-
零成本改造现有项目。
-
对
argparse支持完美。
from gooey import Gooey, GooeyParser@Gooey(program_name="一个简单的计算器")
def main():parser = GooeyParser(description="输入两个数,我来帮你加起来")parser.add_argument('num1', type=int, help='第一个数字')parser.add_argument('num2', type=int, help='第二个数字')args = parser.parse_args()result = args.num1 + args.num2print(f"计算结果是: {result}")# 在GUI模式下,print的内容会显示在一个文本框里if __name__ == '__main__':main()
总结
Python的GUI库还是有很多很好用的。
-
想快速搞定个小工具,Tkinter 和 PySimpleGUI 随叫随到。
-
追求现代化UI和跨平台,Flet 和 NiceGUI 让你眼前一亮。
-
已有Web项目想打包,PyWebview 是轻量级的最佳选择。
-
需要处理海量数据或追求极致性能,Dear PyGui 舍我其谁。
-
想进军移动端或触摸屏,Kivy 和 Toga 各有千秋。
-
懒得写GUI,又想给命令行工具套个壳,Gooey 就是你的“一键美颜”按钮。
无论你的需求是什么,总能找到合适的轮子。下次再有人说Python做不了桌面应用,就把这篇文章甩给他!
