你是不是也覺得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 messagebox
def 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 == '退出':
break
if 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 time
def main(page: ft.Page):
page.title = "Flet 計數器"
page.vertical_alignment = ft.MainAxisAlignment.CENTER
txt_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 ui
def 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 time
def 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 dpg
dpg.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 Button
class 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, ROW
class 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_box
self.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.num2
print(f"計算結果是: {result}")
# 在GUI模式下,print的內容會顯示在一個文本框裏
if __name__ == '__main__':
main()
總結
Python的GUI庫還是有很多很好用的。
- 想快速搞定個小工具,Tkinter 和 PySimpleGUI 隨叫隨到。
- 追求現代化UI和跨平台,Flet 和 NiceGUI 讓你眼前一亮。
- 已有Web項目想打包,PyWebview 是輕量級的最佳選擇。
- 需要處理海量數據或追求極致性能,Dear PyGui 捨我其誰。
- 想進軍移動端或觸摸屏,Kivy 和 Toga 各有千秋。
- 懶得寫GUI,又想給命令行工具套個殼,Gooey 就是你的“一鍵美顏”按鈕。
無論你的需求是什麼,總能找到合適的輪子。下次再有人説Python做不了桌面應用,就把這篇文章甩給他!