我最近在想一件事,為什麼... 為什麼都 2024 年了,很多用 Python 寫的 GUI 工具,看起來還是那麼像 2005 年的東西?
你知道的,就是那種... Windows XP 風格的視窗,灰色的按鈕,邊框生硬。每次看到用 Tkinter 或某些老舊函式庫做出來的介面,我腦中都會浮現大學時代的選課系統。真的不是討厭 GUI 編程,只是那種過時的感覺,讓人有點提不起勁。
所以我就花了點時間,真的去挖了一下,想找出一些「現代」一點的 Python GUI 函式庫。不是那種只能做個「Hello World」就沒下文的玩具,而是真的能用在專案上,而且看起來不會讓你覺得羞恥的工具。
這篇就是我的整理筆記。不管你是想做一個精緻的桌面應用、一個給自己用的數據儀表板,還是一個讓你方便拖拉檔案、執行腳本的小工具,下面這些東西,應該... 應該能幫你省下不少時間,也讓你的心血結晶看起來更順眼一點。
所以,到底有哪些選擇?
老實說,選擇還真不少。但我不想只列個清單出來,那沒什麼意思。我自己是習慣把他們分成幾類,這樣比較好思考要用哪個。
大概可以分成:重量級的全能型選手、用 Web 技術來做的、還有一些...嗯...蠻有特色的黑馬。
重量級選手:功能完整,但需要點耐心
這類通常就是指那些功能最完整、最穩定、但也最複雜的。如果你要做的東西是個商業軟體等級的應用,那大概就是從這裡面選。
PySide6 (Qt for Python)
一句話結論:想讓你的 App 在 Windows、macOS 上看起來就像原生軟體,用它就對了。
PySide6 其實就是 Qt 這個 C++ 跨平台框架的官方 Python 版本。Qt 的歷史很久,功能非常非常強大。大名鼎鼎的 Autodesk Maya、VLC 播放器,底層都有 Qt 的影子。所以,它的穩定性和效能是不用懷疑的。
不過呢,它的學習曲線也是最陡峭的。你需要理解它的一套設計邏輯,像是「信號與槽」(signals & slots)、各種佈局管理器...等等。跟寫網頁前端的思維模式完全不同。我自己是覺得,一旦你跨過了那個坎,就會覺得它無比強大。
說到這個,Qt 的文件量雖然超級龐大,但好處是中英文資料都很多。特別是 C++ 的社群,有很多資源可以參考,很多時候稍微改一下就能在 Python 裡用。這點跟一些新興框架很不一樣,像後面會提到的 Flet,目前主要還是得看英文的官方文件或 Discord 社群,中文的討論就少很多。
from PySide6.QtWidgets import QApplication, QPushButton
# 這段程式碼很短,但背後是一個完整的事件循環
app = QApplication([])
button = QPushButton("點我一下")
button.show()
app.exec()
現代魔法:用新思維做 GUI
接下來這幾個,是我自己覺得最有趣、也最能體現「現代感」的。它們通常用了一些比較新的技術或思維,開發起來會感覺...嗯,愉快很多。
Flet
一句話結論:用寫 Python 的方式,直接寫出 Flutter App,還能跑在網頁上。
這個真的很酷。Flet 讓你用 Python 來控制 Flutter 引擎。Flutter 是 Google 開發的 UI 工具包,以漂亮的介面和高效能著稱。本來要寫 Dart 語言才能用,但 Flet 把它搬到了 Python 世界。
最棒的是,你完全不用碰前端的 HTML/CSS/JS,也不用學 Dart。你就只是寫 Python,定義你的按鈕、輸入框、排版,它就會即時呈現在一個視窗裡,而且還支援熱重載(Hot Reload),改完程式碼存檔,介面就自動更新,開發體驗超好。
import flet as ft
def main(page: ft.Page):
page.title = "Flet 範例"
def btn_click(e):
if not txt_name.value:
txt_name.error_text = "名字不能是空的!"
page.update()
else:
name = txt_name.value
page.clean()
page.add(ft.Text(f"哈囉, {name}!"))
txt_name = ft.TextField(label="你的名字")
page.add(
txt_name,
ft.ElevatedButton("送出", on_click=btn_click)
)
ft.app(target=main)
你看,它的寫法非常直觀,有點像在組合積木。做出來的介面也很現代,內建就有 Material Design 風格。
Dear PyGui
一句話結論:需要高效能、硬體加速的介面,特別是做工程或遊戲工具。
Dear PyGui 是少數幾個直接利用 GPU 進行渲染的函式庫。所以它的反應速度非常快,拖動視窗、繪製圖表都很流暢,完全不卡頓。它的寫法也很特別,是一種「立即模式」(Immediate Mode) 的 API,這在遊戲開發領域比較常見。
簡單說,你不用去管理什麼物件狀態,你只要在每一幀(frame)告訴它要畫什麼就行了。這讓它在做一些需要即時更新數據的儀表板、或是科學計算視覺化的工具時,特別好用。它內建的圖表、表格、日誌功能都非常強大。
from dearpygui.core import *
from dearpygui.simple import *
def log_message(sender, data):
log_info("按鈕被點擊了!")
with window("主視窗"):
add_button("紀錄訊息", callback=log_message)
add_input_text("輸入框")
# 這個 Logger 視窗超實用
add_logger()
start_dearpygui()
另闢蹊徑:非傳統 GUI 方案
有時候我們不一定需要一個獨立的桌面視窗。有些工具,用其他形式呈現反而更方便。
Textual
一句話結論:讓你的終端機應用程式,變得跟 VS Code 一樣酷炫。
Textual 這個專案,我真的超愛。它讓你可以在終端機(Terminal)裡面,建立擁有佈局、色彩、滑鼠互動,甚至是動畫的 TUI (Text-based User Interface)。
如果你寫過一些命令列工具,就知道傳統的 `print` 和 `input` 能做到的很有限。但 Textual 讓你像在寫網頁一樣,用類似 CSS 的方式來排版你的終端機畫面。你可以有按鈕、輸入框、進度條...。對於那些需要在遠端伺服器上運行的管理工具、監控面板來說,這簡直是神器,因為你不需要圖形介面環境就能跑。
Eel
一句話結論:給會寫網頁前端的人,用 Python 當作桌面應用的「大腦」。
如果你本身就熟悉 HTML/CSS/JavaScript,那 Eel 可能會是你的最愛。它的概念很簡單:你用你最熟悉的網頁技術來打造使用者介面,然後用 Eel 把這個前端跟你的 Python 後端邏輯「黏」起來。
它會在本地開一個小小的網頁伺服器,然後用一個極輕量的瀏覽器視窗來顯示你的 `index.html`。你可以從 JavaScript 呼叫 Python 函式,也能從 Python 呼叫 JavaScript 函式。跟 Electron 比起來,它打包後的體積小非常非常多,因為它用的是系統內建的瀏覽器引擎,而不是自己包一個完整的 Chromium。
所以...我到底該選哪個?
嗯...這問題沒有標準答案。每次選技術都是一種取捨。所以我弄了個簡單的比較表,把我自己的感覺放進去,可能會比較好懂。
| 框架 (Framework) | 感覺如何 (Look & Feel) | 好不好上手 (Learning Curve) | 最適合做啥 (Best For...) |
|---|---|---|---|
| PySide6 (Qt) | 非常原生,跟作業系統融為一體。但要好看,得自己花時間用 QSS (類似 CSS) 刻。 | 高。觀念很多,要學的東西不少,得有心理準備把它當一門課來學。 | 功能超複雜、需要長期維護的專業桌面軟體。比如影片剪輯、3D 建模輔助工具之類的。 |
| Flet | 很現代,有 Google 的 Material Design 風格。開箱即用,不用調就蠻好看的。 | 低。寫起來就像在組合樂高,很直覺。就算沒 GUI 經驗也能快速上手。 | 想快速弄出一個漂亮的小工具、內部儀表板,或是你的個人專案。跨平台發佈也簡單。 |
| Dear PyGui | 科技感、工程感很重。預設主題有點像遊戲引擎的編輯器。不是走傳統軟體路線。 | 中等。API 很獨特,跟傳統 GUI 不一樣。但理解了它的邏輯後,寫起來會很快。 | 需要即時更新大量數據的儀表板、科學模擬、資料視覺化工具。任何需要 GPU 加速的場景。 |
| CustomTkinter | 比原本的 Tkinter 好看一百倍。有深色模式,元件也比較現代。但骨子裡還是 Tkinter。 | 非常低。如果你會 Tkinter,幾乎是無痛轉移,API 很像。 | 學校作業、教學範例,或是你被迫要用 Tkinter 的老舊專案,想幫它拉皮一下。 |
| Textual | 在終端機裡算是頂級酷炫了。有版面、有顏色、有互動,像是跑在文字模式裡的 App。 | 中等。需要學它那套基於 CSS Flexbox 的佈局系統。但如果你寫過網頁,會覺得很熟悉。 | 任何跑在 Linux 伺服器上的工具。像是系統監控、日誌分析、遠端管理腳本的介面。 |
| Eel | 完全取決於你的前端功力。你可以用 React、Vue,弄得多漂亮都可以。 | 低 (如果你懂前端)。對 Python 開發者來說,就是學幾個簡單的溝通函式而已。 | 前端開發者想用 Python 處理後端邏輯,做成一個輕量級桌面應用。 |
還有一些值得一提的
當然,選擇不止上面這些。像是 Kivy,它在觸控介面和行動裝置上還是很強大;還有 Toga,是 BeeWare 專案的一部分,目標是真正寫一次程式碼就能在所有平台(包括手機)跑,雖然還在發展中,但概念很棒。
PyWebIO 和 Remi 也很類似,它們讓你純用 Python 寫程式,然後在瀏覽器裡生成一個 UI,你連 HTML 都不用寫。這對於快速製作內部使用的小工具非常方便。
結語:別再讓「醜」成為藉口了
我自己覺得,很多 Python 開發者之所以不做 GUI,不是因為它難,而是因為預設的工具做出來...真的太醜了,缺乏成就感。
但現在的情況真的不一樣了。上面這些工具,或多或少都解決了這個「美觀」的問題。有些讓你用更現代的語法,有些直接幫你套上好看的樣式,有些則是讓你發揮你原本就會的網頁技能。
所以,如果你手邊有一個一直想做成圖形介面的小腳本或小工具,但始終因為覺得麻煩或難看而沒動手,或許現在是個好時機,可以再試一次了。Python 的 GUI 生態,真的比你想像的進步更多。
換你說說看:
看完這些,你有用過哪一個嗎?或者,有沒有哪個框架讓你覺得「哦?這個好像可以來試試看」?在下面留言分享一下你的想法吧!
