動態

詳情 返回 返回

構建現代應用的9個Python GUI庫 - 動態 詳情

你是不是也覺得Python好是好,就是做個帶界面的桌面應用太費勁了,是時候打破這個刻板印象了。如今的Python在GUI開發領域早就不是吳下阿蒙了。今天介紹的Python GUI庫都可以打造炫酷的應用。

在此之前,我們先搞定一切的基礎 —— 開發環境。項目一多,Python版本就成了個頭疼事。老項目可能還跑在Python 2.7上,新項目又想用最新的3.12特性,來回切換環境能把人折騰死。

那就不得不安利ServBay了,它能一鍵安裝和管理N個Python版本,支持從老掉牙的2.7到最新的3.14。不管是維護祖傳代碼,還是開發新項目,都不用再為Python版本兼容性問題撓頭了。環境搞定了,咱們才能安心搞開發。

image.png

好了,言歸正傳,來看看有庫能讓我們的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庫還是有很多很好用的。

  • 想快速搞定個小工具,TkinterPySimpleGUI 隨叫隨到。
  • 追求現代化UI和跨平台,FletNiceGUI 讓你眼前一亮。
  • 已有Web項目想打包,PyWebview 是輕量級的最佳選擇。
  • 需要處理海量數據或追求極致性能,Dear PyGui 捨我其誰。
  • 想進軍移動端或觸摸屏,KivyToga 各有千秋。
  • 懶得寫GUI,又想給命令行工具套個殼,Gooey 就是你的“一鍵美顏”按鈕。

無論你的需求是什麼,總能找到合適的輪子。下次再有人説Python做不了桌面應用,就把這篇文章甩給他!

user avatar u_17494575 頭像 u_16776161 頭像 kobe_fans_zxc 頭像 xinggandemuer_b5u1v2 頭像 seazhan 頭像 dunizb 頭像 imba97 頭像 guixiangyyds 頭像 ssbunny 頭像 libubai 頭像 xw-01 頭像 ztn195 頭像
點贊 33 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.