Python技术迷

PySimpleGUI:简化 Python 中的 GUI 开发

前两天在家用电脑写个小工具,就那种输入点东西、点个按钮出个结果的小玩意,本来想用 Tkinter,打开示例代码一看,Grid、Pack、Column…脑袋直接大了。后来换成 PySimpleGUI,一杯咖啡时间就搞定,代码短到有点不真实。

所以今天就聊聊这个库,顺便用 Python 写几个小例子,你照着敲一下就能跑起来的那种。

PySimpleGUI 到底是个啥

简单说,它就是“把复杂 GUI 库包了一层”的一个库。

  • 底层其实还是 Tkinter / Qt / Wx 等这些老牌 GUI 框架
  • 上面套了一层更友好的 API,统一写法,不用管底层是谁
  • 心得只有一句话:把界面当“列表”写,把交互当“while 循环”写

安装就一句:

pip install PySimpleGUI

装完就能玩了。

用 10 行代码弹个窗口出来

先来个最小示例,感受一下味道:

import PySimpleGUI as sg

layout = [
    [sg.Text("你好,PySimpleGUI!")],
    [sg.Button("OK")]
]

window = sg.Window("第一个窗口", layout)

whileTrue:
    event, values = window.read()
if event == sg.WINDOW_CLOSED or event == "OK":
break

window.close()

大概意思帮你翻译下:

  • layout:界面长啥样,用一个二维列表表示,每一行就是一行控件
  • Window:把布局塞进一个窗口里
  • window.read():等用户操作,点按钮、关窗口、输入内容都会触发事件
  • event:发生了什么
  • values:输入框这些控件当前的值

所以你可以把它理解成:while 循环里疯狂 read 事件,按事件干事,结束就 break。

做个有点用的小玩具:实时加法器

来个稍微生活一点的例子,比如办公室总有人拿着计算器算“这个配置一共多少钱”,我们用 PySimpleGUI 写个小加法器,俩数字一输,自动给你算和:

import PySimpleGUI as sg

sg.theme("SystemDefault")

layout = [
    [sg.Text("数字 A"), sg.Input(key="-A-", size=(10, 1)), 
     sg.Text("数字 B"), sg.Input(key="-B-", size=(10, 1))],
    [sg.Text("结果:", size=(8, 1)), sg.Text("0", key="-RESULT-")],
    [sg.Button("计算"), sg.Button("清空"), sg.Button("退出")]
]

window = sg.Window("简单加法器", layout)

whileTrue:
    event, values = window.read()
if event in (sg.WINDOW_CLOSED, "退出"):
break

if event == "清空":
        window["-A-"].update("")
        window["-B-"].update("")
        window["-RESULT-"].update("0")
continue

if event == "计算":
try:
            a = float(values["-A-"] or0)
            b = float(values["-B-"] or0)
            window["-RESULT-"].update(str(a + b))
except ValueError:
            sg.popup("请输入正确的数字哦")

window.close()

这段里有几个小点挺值得记一下:

  • Input 要配 key,后面才能用 values["-A-"] 读它
  • window["-RESULT-"].update(...) 这个写法是更新控件内容,很常用
  • 错误直接 popup 弹一下消息,比 print 舒服多了

你会发现,整个程序其实就俩核心东西:布局 + 事件循环,没有一堆回调函数到处飞。

布局这块咋想比较顺

PySimpleGUI 的布局结构就是“列表套列表”,你脑子里只要先画一行一行的界面,再按行写就行。

比如做个“待办小记事本”这种界面:

  • 第一行:一个输入框 + “添加”按钮
  • 第二行:一个列表显示所有待办
  • 第三行:一个“删除选中”按钮 + 一个“退出”

直接翻译成代码:

import PySimpleGUI as sg

layout = [
    [sg.Input(key="-TODO-"), sg.Button("添加")],
    [sg.Listbox(values=[], size=(30, 8), key="-LIST-", enable_events=True)],
    [sg.Button("删除选中"), sg.Button("退出")]
]

window = sg.Window("待办小记事本", layout)
todos = []

whileTrue:
    event, values = window.read()
if event in (sg.WINDOW_CLOSED, "退出"):
break

if event == "添加":
        text = values["-TODO-"].strip()
if text:
            todos.append(text)
            window["-LIST-"].update(todos)
            window["-TODO-"].update("")

if event == "删除选中":
        selected = values["-LIST-"]
if selected:
            todos.remove(selected[0])
            window["-LIST-"].update(todos)

window.close()

这个小例子已经有点“产品味”了:

  • 有输入、有列表、有增删
  • 状态放在 todos 列表里
  • 每次改数据就 update 一下列表控件

你要是用 Tkinter 自己撸这个,代码量起码翻一倍,还得研究 Listbox 怎么绑事件、怎么拿选中项等等。 功能拆几块

整体来说,如果你现在写 Python 还停留在命令行那种“input / print”的阶段,其实完全可以挑一个小需求,用 PySimpleGUI 改成带窗口的版本,哪怕就是个“批量重命名文件”“一键压缩图片”这种,很快就能上手。

差不多就聊到这,你要是已经装好环境,可以随便拎上面任何一段代码跑一跑,改两下文本、改个标题,基本就算入门了。

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB