PySimpleGUI:简化 Python 中的 GUI 开发
前两天在家用电脑写个小工具,就那种输入点东西、点个按钮出个结果的小玩意,本来想用 Tkinter,打开示例代码一看,Grid、Pack、Column…脑袋直接大了。后来换成 PySimpleGUI,一杯咖啡时间就搞定,代码短到有点不真实。
所以今天就聊聊这个库,顺便用 Python 写几个小例子,你照着敲一下就能跑起来的那种。
PySimpleGUI 到底是个啥
简单说,它就是“把复杂 GUI 库包了一层”的一个库。
底层其实还是 Tkinter / Qt / Wx 等这些老牌 GUI 框架 上面套了一层更友好的 API,统一写法,不用管底层是谁 心得只有一句话:把界面当“列表”写,把交互当“while 循环”写
安装就一句:
pip install PySimpleGUI
装完就能玩了。
用 10 行代码弹个窗口出来
先来个最小示例,感受一下味道:
import PySimpleGUI as sglayout = [
[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 sgsg.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 sglayout = [
[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