构建现代应用的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标准库成员,无需安装。
  • 简单直接,上手快。
  • 界面拥有内在美。
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高不少。
  • 适合快速开发简单的图形界面工具。
python 复制代码
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来说是绝配。

css 复制代码
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的内部工具。

python 复制代码
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双向通信,灵活性高。
python 复制代码
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。
python 复制代码
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外观在所有平台保持一致。

python 复制代码
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套件的一部分,生态完整。

  • 跨平台,但追求平台原生外观。

python 复制代码
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支持完美。

python 复制代码
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做不了桌面应用,就把这篇文章甩给他!

相关推荐
abiao19817 小时前
VUE的“单向数据绑定” 和 “双向数据绑定”
前端·javascript·vue.js
自珍JAVA7 小时前
【Apollo】@ApolloConfigChangeListener(interestedKeys = "config.key")
后端
LoveDreaMing7 小时前
微前端-无界的实操和源码分析
前端·javascript·架构
王道长AWS_服务器7 小时前
AWS + Discuz!:社区站架构的现代化玩法
后端·程序员·aws
Java中文社群7 小时前
用代码书写浪漫,网友直呼“太美了”!
python
@LetsTGBot搜索引擎机器人7 小时前
打造属于你的 Telegram 中文版:汉化方案 + @letstgbot 搜索引擎整合教程
开发语言·python·搜索引擎·机器人·.net
去伪存真7 小时前
「实测可行」Tailwind CSS 4 与 UnoCSS 最新配置全攻略:一把跑通不踩坑
前端
十八朵郁金香7 小时前
【H5工具】一个简约高级感渐变海报H5设计工具
前端·javascript·产品运营·axure·个人开发
人工智能的苟富贵7 小时前
使用 Tauri + Rust 构建跨平台桌面应用:前端技术的新边界
开发语言·前端·rust·electron