2025 年,這九個(gè) Python GUI 庫讓我眼前一亮
還記得那些只能在黑乎乎命令行中運(yùn)行的Python腳本嗎?時(shí)代變了!2025年的用戶期待的是界面美觀、交互流暢的現(xiàn)代應(yīng)用。好消息是,Python的GUI生態(tài)系統(tǒng)已經(jīng)悄然進(jìn)化,涌現(xiàn)出一批強(qiáng)大而又易用的界面庫。
無論你是想快速開發(fā)一個(gè)小工具,還是構(gòu)建復(fù)雜的企業(yè)級應(yīng)用,總有一款適合你。下面就為大家介紹8個(gè)值得關(guān)注的Python GUI庫。
傳統(tǒng)桌面應(yīng)用庫
1. Tkinter - Python內(nèi)置的GUI工具包
作為Python標(biāo)準(zhǔn)庫的一部分,Tkinter無需額外安裝,是初學(xué)者入門GUI開發(fā)最直接的選擇。它提供了基本的窗口、按鈕、輸入框等組件,足以快速構(gòu)建小型桌面工具。
import tkinter as tk
def say_hello():
greeting_label.config(text="Hello, " + name_entry.get())
# 創(chuàng)建主窗口
root = tk.Tk()
root.title("Tkinter Example")
root.geometry("300x150")
# 創(chuàng)建控件
name_label = tk.Label(root, text="Enter your name:")
name_entry = tk.Entry(root)
greeting_label = tk.Label(root, text="")
confirm_button = tk.Button(root, text="Say Hello", command=say_hello)
# 布局控件
name_label.pack(pady=5)
name_entry.pack(pady=5)
confirm_button.pack(pady=5)
greeting_label.pack(pady=5)
# 啟動事件循環(huán)
root.mainloop(A2. Kivy - 跨平臺的多點(diǎn)觸控應(yīng)用庫
Kivy是一個(gè)開源的Python庫,非常適合開發(fā)需要跨平臺(包括移動設(shè)備)運(yùn)行且支持多點(diǎn)觸控的應(yīng)用程序。它使用獨(dú)特的KV語言來分離界面設(shè)計(jì)與業(yè)務(wù)邏輯。
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
class KivyApp(App):
def build(self):
# 創(chuàng)建主布局
layout = BoxLayout(orientatinotallow='vertical', padding=20, spacing=10)
# 創(chuàng)建控件
self.name_input = TextInput(
hint_text='Enter your name',
size_hint=(1, 0.2)
)
self.greeting_label = Label(
text='Greeting will appear here',
size_hint=(1, 0.2)
)
confirm_button = Button(
text='Say Hello',
size_hint=(1, 0.2)
)
confirm_button.bind(on_press=self.say_hello)
# 添加控件到布局
layout.add_widget(self.name_input)
layout.add_widget(confirm_button)
layout.add_widget(self.greeting_label)
return layout
def say_hello(self, instance):
self.greeting_label.text = "Hello, " + self.name_input.text
if __name__ == '__main__':
KivyApp().run()現(xiàn)代Web風(fēng)格應(yīng)用庫
3. Flet - 基于Flutter的現(xiàn)代UI
Flet是一個(gè)新興的GUI框架,它將Flutter的強(qiáng)大UI引擎帶到了Python中-2。你可以使用Python構(gòu)建美觀的Web、桌面和移動應(yīng)用,享受熱重載、跨平臺部署等特性,而無需編寫任何Dart代碼。
圖片
Flet允許開發(fā)者使用Python語言,利用Flutter的強(qiáng)大能力來構(gòu)建美觀的Web、桌面和移動應(yīng)用。它支持熱重載和跨平臺部署,讓你能用純Python創(chuàng)建出像素級完美的界面。
核心特性:
- 純Python編寫UI,無需HTML/CSS/JS
- 支持Web、桌面和移動端運(yùn)行
- 實(shí)時(shí)熱更新、調(diào)試體驗(yàn)流暢
import flet as ft
def main(page: ft.Page):
# 頁面基礎(chǔ)設(shè)置
page.title = "Flet Example"
page.vertical_alignment = ft.MainAxisAlignment.CENTER
page.horizontal_alignment = ft.CrossAxisAlignment.CENTER
# 創(chuàng)建控件
name_field = ft.TextField(
label="Your name",
width=300,
text_align=ft.TextAlign.LEFT
)
greeting_text = ft.Text()
def button_clicked(e):
greeting_text.value = f"Hello, {name_field.value}!"
page.update()
confirm_button = ft.ElevatedButton(
text="Say Hello",
on_click=button_clicked
)
# 將控件添加到頁面
page.add(
name_field,
confirm_button,
greeting_text
)
# 啟動應(yīng)用(可在桌面運(yùn)行,或通過瀏覽器訪問)
ft.app(target=main)
# 若想以Web應(yīng)用運(yùn)行,可改用:ft.app(target=main, view=ft.WEB_BROWSER)4. NiceGUI - 簡約高效的Web界面
NiceGUI是一個(gè)基于FastAPI和Vue.js的高級GUI框架,讓你只需編寫Python代碼就能創(chuàng)建出功能豐富的瀏覽器基應(yīng)用。它非常適合制作儀表盤、內(nèi)部工具或交互式原型。
NiceGUI讓你能夠通過編寫純Python代碼,生成基于瀏覽器的精美用戶界面。它底層使用FastAPI和Vue.js,但你完全不需要了解這些技術(shù),只需專注于Python開發(fā)即可。
典型應(yīng)用場景:
- 內(nèi)部工具和儀表盤開發(fā)
- 交互式原型設(shè)計(jì)
- 實(shí)時(shí)數(shù)據(jù)監(jiān)控界面
from nicegui import ui
def greet():
greeting_label.set_text(f"Hello, {name_input.value}!")
# 創(chuàng)建控件
name_input = ui.input(label='Enter your name')
confirm_button = ui.button('Say Hello', on_click=greet)
greeting_label = ui.label()
# 啟動應(yīng)用(默認(rèn)在 http://localhost:8080 運(yùn)行)
ui.run()最近發(fā)布的NiceGUI 3.0.0引入了許多新特性和改進(jìn),包括新的腳本模式和事件系統(tǒng),值得關(guān)注。
5. Eel - 連接Python與Web技術(shù)
Eel是一個(gè)輕量級的庫,可以讓你輕松地將Python后端與基于HTML/CSS/JavaScript的前端連接起來。如果你已有Web開發(fā)經(jīng)驗(yàn),希望用Web技術(shù)構(gòu)建桌面應(yīng)用界面,Eel是個(gè)不錯(cuò)的選擇。
Eel入門還有一些案例_eel庫-CSDN博客
如果你已經(jīng)熟悉HTML、CSS和JavaScript,Eel提供了一種簡單的方式,將現(xiàn)有的Web技術(shù)封裝到Python應(yīng)用程序中。它類似于Electron,但更加輕量級。
核心特性:
- 支持現(xiàn)有的Web技術(shù)棧
- Python與JavaScript雙向通信
- 輕量級,易于上手
Python后端 (main.py):
import eel
# 初始化包含Web文件的文件夾
eel.init('web')
# 暴露Python函數(shù)給JavaScript
@eel.expose
def greet_user(name):
return f"Hello, {name}!"
# 啟動應(yīng)用
eel.start('index.html', size=(400, 300))HTML前端 (web/index.html):
<!DOCTYPE html>
<html>
<head>
<title>Eel Example</title>
</head>
<body>
<input type="text" id="nameInput" placeholder="Enter your name">
<button onclick="sayHello()">Say Hello</button>
<p id="greeting"></p>
<script type="text/javascript" src="/eel.js"></script>
<script>
async function sayHello() {
const name = document.getElementById('nameInput').value;
const greeting = await eel.greet_user(name)();
document.getElementById('greeting').innerText = greeting;
}
</script>
</body>
</html>6. Reflex - 全棧Python解決方案
Reflex(前身為Pynecone)讓你能夠完全使用Python構(gòu)建全棧Web應(yīng)用。它會自動生成React前端,并提供內(nèi)置的狀態(tài)管理,非常適合需要現(xiàn)代化用戶界面的復(fù)雜應(yīng)用。
特色功能:
- 完整的全棧應(yīng)用開發(fā)能力
- 內(nèi)置狀態(tài)管理
- 基于React的高質(zhì)量UI
import reflex as rx
class State(rx.State):
name: str = ""
counter: int = 0
def set_name(self, name):
self.name = name
def increment_counter(self):
self.counter += 1
def index():
return rx.vstack(
rx.input(
placeholder="Enter your name",
on_change=State.set_name,
width="200px"
),
rx.button(
"Say Hello",
on_click=lambda: State.set_name(State.name),
width="200px"
),
rx.text(State.name),
rx.divider(),
rx.text(f"Counter: {State.counter}"),
rx.button(
"Increment",
on_click=State.increment_counter,
width="200px"
),
spacing="1em",
align="center",
padding_top="10%"
)
app = rx.App()
app.add_page(index)
app.compile()7. PyWebView - 輕量級Web視圖
PyWebView使用系統(tǒng)原生的WebView組件來顯示W(wǎng)eb內(nèi)容,而無需像Electron那樣捆綁整個(gè)瀏覽器引擎。它是一個(gè)極其輕量級的解決方案,適合將現(xiàn)有Web應(yīng)用打包為桌面程序。
pywebview | pywebview
macOS
核心優(yōu)勢:
- 超輕量級,占用資源少
- 原生窗口與Web技術(shù)結(jié)合
- 簡單的JavaScript-Python橋接
import webview
import threading
def run_window():
# 創(chuàng)建瀏覽器窗口
window = webview.create_window(
'PyWebView Example',
'web/index.html', # 加載本地HTML文件
width=400,
height=300
)
webview.start()
# 在后臺線程中啟動窗口
if __name__ == '__main__':
thread = threading.Thread(target=run_window)
thread.start()終端文本界面庫
8. Textual - 終端里的現(xiàn)代GUI
Textual是一個(gè)強(qiáng)大的Python庫,用于在終端中創(chuàng)建豐富的文本用戶界面。它支持類似CSS的樣式、鼠標(biāo)操作和異步編程,可以讓你為命令行工具打造現(xiàn)代感的交互體驗(yàn)。
圖片
Textual是一個(gè)用于構(gòu)建現(xiàn)代文本用戶界面的框架,它在終端中提供了類似GUI的體驗(yàn)。支持1670萬種顏色、鼠標(biāo)交互和流暢的動畫效果,徹底改變了傳統(tǒng)命令行工具的使用體驗(yàn)。
核心優(yōu)勢:
- 在終端中創(chuàng)建豐富的用戶界面
- 支持CSS樣式和現(xiàn)代色彩
- 完整的鼠標(biāo)和鍵盤支持
適用場景:
- 終端工具開發(fā)
- 數(shù)據(jù)可視化
- 系統(tǒng)監(jiān)控工具
from textual.app import App, ComposeResult
from textual.widgets import Header, Footer, Static
from textual.containers import Container
from textual import events
class ClockApp(App):
CSS = """
Container {
align: center middle;
height: 100%;
}
#time_display {
width: auto;
height: auto;
background: $panel;
color: $text;
padding: 1 2;
border: tall $background;
}
#time_display:focus {
border: tall $accent;
}
"""
def compose(self) -> ComposeResult:
yield Header()
yield Container(Static("00:00:00", id="time_display"))
yield Footer()
def on_ready(self) -> None:
self.set_interval(1, self.update_time)
def update_time(self):
from datetime import datetime
current_time = datetime.now().strftime("%H:%M:%S")
self.query_one("#time_display", Static).update(current_time)
if __name__ == "__main__":
app = ClockApp()
app.run()高性能專業(yè)應(yīng)用庫
9. Dear PyGui - GPU加速的專業(yè)級GUI
Dear PyGui是一個(gè)GPU加速的圖形界面庫,其設(shè)計(jì)靈感來源于游戲引擎。它特別適合需要高頻刷新和數(shù)據(jù)可視化的場景,如工程工具、科學(xué)計(jì)算和實(shí)時(shí)儀表盤。

如果你需要開發(fā)數(shù)據(jù)可視化應(yīng)用、工程工具或?qū)崟r(shí)儀表盤,Dear PyGui是個(gè)不錯(cuò)的選擇。它采用GPU加速渲染,性能出色,特別適合需要高頻刷新和數(shù)據(jù)密集型場景。
核心優(yōu)勢:
- GPU加速渲染,性能卓越
- 專為數(shù)據(jù)可視化和高頻刷新場景設(shè)計(jì)
- 類似游戲引擎的即時(shí)模式界面
from dearpygui.core import *
from dearpygui.simple import *
def save_callback(sender, data):
input_value = get_value("Input Text")
log_debug(f"Input value saved as: {input_value}")
def button_callback(sender, data):
input_value = get_value("Input Text")
add_text("Result Text", f"You entered: {input_value}")
with window("Main Window"):
add_text("This is a Dear PyGUI example")
add_input_text("Input Text", label="Type something", default_value="Hello GUI")
add_button("Show Input", callback=button_callback)
add_same_line()
add_button("Save", callback=save_callback)
add_separator()
add_text("Result Text", default_value="Your input will appear here")
start_dearpygui()各場景選庫參考
選擇哪個(gè)庫,主要看你的具體需求:
- 初學(xué)者或快速開發(fā)小型工具:從 Tkinter 開始最穩(wěn)妥。
- 移動端或需要觸控支持:Kivy 是專為此設(shè)計(jì)的。
- 追求美觀且跨平臺的現(xiàn)代應(yīng)用:Flet 能帶來類似Flutter的體驗(yàn)。
- 數(shù)據(jù)密集型或高性能應(yīng)用:Dear PyGui 的GPU加速能派上用場。
- 快速創(chuàng)建瀏覽器基的內(nèi)部工具:NiceGUI 或 Reflex 效率很高。
- 將現(xiàn)有Web項(xiàng)目打包為桌面應(yīng)用:Eel 或 PyWebView 很合適。
- 為命令行工具增強(qiáng)交互性:Textual 能讓終端程序煥然一新。
庫名稱 | 主要特點(diǎn) | 理想應(yīng)用場景 | 示例代碼簡要說明 |
Flet | 基于Flutter,跨平臺(Web/桌面/移動) | 需要精美UI和跨平臺部署的現(xiàn)代應(yīng)用 | 簡單的輸入和按鈕交互 |
Dear PyGui | GPU加速,適合數(shù)據(jù)密集型應(yīng)用 | 數(shù)據(jù)可視化、工程工具、實(shí)時(shí)儀表盤 | 基礎(chǔ)窗口和交互元素 |
NiceGUI | 基于Web,僅需Python,自動生成VueJS前端 | 內(nèi)部工具、儀表盤、交互式原型 | 輸入響應(yīng)和最小應(yīng)用結(jié)構(gòu) |
Eel | 輕量級,可連接Python與現(xiàn)有Web技術(shù)(HTML/CSS/JS) | 將現(xiàn)有Web項(xiàng)目快速打包為桌面應(yīng)用 | Python與JavaScript的互相調(diào)用 |
Reflex | 全棧Python,生成React前端,內(nèi)置狀態(tài)管理 | 需要React級別UI質(zhì)量的全棧Web應(yīng)用 | 狀態(tài)管理與UI綁定的計(jì)數(shù)器 |
Textual | 在終端中創(chuàng)建豐富的文本用戶界面,支持CSS和鼠標(biāo) | 終端工具、數(shù)據(jù)監(jiān)控、命令行程序現(xiàn)代化 | 簡單的計(jì)時(shí)器顯示 |
PyWebView | 輕量級,使用系統(tǒng)原生WebView組件 | 以最小開銷將Web應(yīng)用嵌入原生窗口 | 創(chuàng)建加載網(wǎng)頁的窗口 |
Tkinter | Python內(nèi)置,無需安裝,簡單易用 | 快速開發(fā)小型桌面工具、初學(xué)者學(xué)習(xí) | 經(jīng)典的按鈕點(diǎn)擊事件 |
Kivy | 開源,跨平臺,支持多點(diǎn)觸控 | 移動應(yīng)用、需要觸控功能的桌面應(yīng)用 | 屏幕管理和按鈕交互 |
希望這些例子能幫助你更好地向讀者展示不同Python GUI庫的特點(diǎn)。根據(jù)文章風(fēng)格,你可以選擇呈現(xiàn)全部或部分示例。































