前言
我其实是一个学习能力很差的人,举个例子,我看官方文档从来没有直接看懂过,大多数时候必须要一遍遍运行代码,或者看别人的解释才能懂。为此,有好多(我看起来)复杂的库根本就没有兴趣接触,比如说可视化matplotlib
,又或者是Tkinter
,我是真记不住那些设置。
后来,我接触到了一些其他可替代的库,突然发现好像也不是那么难嘛,所以打算写个系列文章,介绍一下可以用来进阶的,简单的库。反正我这样的小白都能很容易入门。
教程直接搬的官方文档,原文: https://pysimplegui.readthedocs.io/en/latest/
当然,只选择了可能对我有用的部分,其他复杂的先不看,有需要时再说。
快速开始
效果:

event和Values详解
当执行window.read()
函数时,将会返回一个(event,values)
元组。event
是事件,它可能是一个按钮的按下、列表项的选择等,比如我设置了一个sg.Submit('提交')
按钮,那么event返回的是'提交'
。如果我什么也不填,sg.Submit()
,那么返回默认值'Submit'
,当然界面上显示的也是Submit。如果用户点击右上角X关闭窗口,则是None
。
注意,默认情况下只有Button才能触发事件,然后执行window.read(),也就是说返回的event始终是button名。但是如果你给控件加上一个enable_events=True
参数,那么点击任何控件都可以触发事件了,比如说sg.Text('My one-shot window.',enable_events=True)
,那么点击文本也可以触发事件。
values
是一个包含所有输入元素的值的字典。字典使用键来定义词条。如果你的元素没有特定的键,系统为你提供一个键。这些自动编号的键是以0开始的。
比如说我有两个输入框,则第一个输入框的值是values[0],第二个输入框的值是values[1]
下面的例子:
如果你想使用自定义key?很简单,相应位置修改为以下代码:
如何更新数据?
下面是一个例子,使用window[index].update(指定值)
的方法,可以更新key为index控件的值,当然,指定值可以是另外一个控件的值,一个例子如下:
PS:下文中我会介绍一个target参数,我觉得也挺好用的
手册
window
可用控件列表
使用方法:直接sg.Text()
即可
- Text # 文本
- InputText # 单行输入框
Button # 按钮
- FileBrowse # 文件选择,选择多个文件FilesBrowse,保存文件FileSaveAs
- FolderBrowse # 文件夹选择
- CalendarButton # 日历选择,必须输入按钮名如
'choose date'
,返回字符串 - ColorChooser # 颜色选择,如sg.ColorChooserButton('颜色选择'),返回RGB元组
- Combo # 下拉选择菜单,如sg.Combo(['choice 1', 'choice 2'])
- Checkbox # 复选框。如sg.Checkbox('My first Checkbox!', default=True), sg.Checkbox('My second Checkbox!'),返回布尔值
- Radio # 单选按钮,如sg.Radio('My first Radio!', "RADIO1", default=True),sg.Radio('My second radio!', "RADIO1"),第一个是显示的字符,第二个是单选按钮所在组,只有在同一组的单选按钮才有排他性,第三个是默认选中,返回布尔值True or False
- Listbox # 列表框,如sg.Listbox(values=['Listbox 1', 'Listbox 2', 'Listbox 3']
- Slider # 滚动条,如sg.Slider(range=(1,500),default_value=222,orientation='horizontal'),垂直是vertical
- Multiline # 多行输入框
- Multi-line Text Output (not on tkinter version)
- Spin # 一个可以上下调节的控件,像一个简化版的滚动条?如sg.Spin([i for i in range(1,11)], initial_value=1)
- ProgressBar # 进度条,下面是一个使用案例:
- Menu # 菜单
- ButtonMenu # 菜单按钮
- Frame # 框,如下面的代码:

- Image # 图片查看,只支持png,gif格式,如sg.Image(r'C:\PySimpleGUI\Logos\PySimpleGUI_Logo_320.png'),不知道为什么我运行这个函数总会有各种问题……
- TabGroup # 选项卡
- Output # 输出框,可以使用print()直接打印,下面是一个例子:
基本可用参数:
key
,指定键名size=(8,6)
,控件大小font = ('宋体',15)
,字体,前者是字体类型,后者是字体大小enable_events
,是否触发事件justification='center'
,居中
内置Button
虽然官方列了很多内置Button,但是测试下来似乎并没有什么特殊效果,只是多了可以直接使用的Button罢了
- OK
- Ok
- Submit
- Cancel
- Yes
- No
- Exit
- Quit
- Help
- Save
- SaveAs
- Open
比如说,你可以直接sg.OK()
,也可以sg.Button('OK')
target参数
选择器型控件,如FileBrowse,FilesBrowse,FolderBrowse,FileSaveAs,CalendarButton,ColorChooserButton,会传递选择值给窗口上的另外一个控件,可以是Text
,InputText
或它本身。比如它与输入框在同一行时会传地址给输入框,如[sg.InputText(),sg.FolderBrowse()]
,可以为输入框加一个visible=False
参数隐藏(是隐藏整个输入框)。
那么我想让值传递给指定控件,可以加一个target
参数,如:
这样选择的值就会传递给相同key的控件
注意,使用此参数时,就无法获取选择器控件的值了,比如说上面的例子,你就无法print(values['_BUTTON_KEY_'])
popup
popup
简单来说,popup就是一个弹出窗口,执行该函数时,会停止执行当前窗口,直到用户关闭弹出窗口时才会重新执行。
可以输入任意数量的参数,都会转化为字符串并输出。
拥有以下类型的popup:
比如popup_ok
是一个带有ok按钮的弹出窗口,popup_timed
是一个过一段时间自动关掉的弹出窗口。
popup
中可以输入的参数,自行help(sg.popup)
,需要注意的一点是因为popup会把所有输入的参数都当做字符串输出,所以特殊的参数需要标识出来,比如sg.popup('values[0],values[1],title="test"')
popup_scrolled
还有一类特殊的popup,即Scrolled Output
,它展示的是带有滚动条的弹出窗口,适用于展示大量信息时,函数名为sg.popup_scrolled()
。
popup_scrolled会自动调整大小,如果想自定义的话,可以sg.popup_scrolled(my_text, size=(80, None))
上述代码会展示一个宽度为80字符,高度随输出字符串变化的弹出窗口。
效果

popup_get_file
获取一个或多个文件地址
效果:

特殊参数:
save_as=False
,是否显示保存按钮,multiple_files=False
是否允许选择多个文件,no_window=False
是否跳过弹出窗口直接显示系统打开文件界面?
popup_get_folder
即获取文件夹路径
注意,该函数没有save_as=False
与multiple_files=False
参数,但是有no_window=False
主题theme
下面代码创造了一个主题浏览器,可以用下拉餐单切换预览所有主题

实战:写一个简单的批量重命名工具
直接上代码吧,功能挺简单的,就是把某一个文件夹下所有文件全部重命名为hash值+后缀的形式,如果有两个文件hash值一样,则把其中一个移到重复文件夹
下。
效果图:

感觉可以把我所有写的代码都搞一个GUI,(好像也没啥实际用处)
版权属于:作者名称
本文链接:https://www.sitstars.com/archives/82/
转载时须注明出处及本声明
老师,请教一下,如何将多个前面的返回值放在同一行的弹窗里?
王嘉凝 2022-04-19
多个返回值?那你把他们用字符串拼接起来不就行了?
雁陎 2022-04-19 回复 @王嘉凝
老师,请教下,元素radio 返回的是布尔值,我要获取radio的文本,难道要遍历吗
无尾熊 2022-02-15
实例化一个radio后,应该有个text属性
雁陎 2022-02-15 回复 @无尾熊
tab 如何用代码切换选项卡?
111 2021-12-21
不过有个问题请问您一下,我发现 Mac 下会出现这个问题(https://stackoverflow.com/questions/46999695/class-fifindersyncextensionhost-is-implemented-in-both-warning-in-xcode-si/47013488#47013488),不知道您用 Mac 的 VS Code + Conda 写过 Python 没?蛮奇怪的问题……
溪夜 2020-08-01
我没用过mac,看评论都是说mac本身的问题?你要不试试python内置的ide,或者anaconda的spyder?
雁陎 2020-08-02 回复 @溪夜
哈哈对的,因为确实只算个Warning ::aru:speechless:: 您说的有道理,我试试spyder,之前一直用VSCode和jupyter notebook来着
溪夜 2020-08-02 回复 @雁陎
多谢兄弟的代码!SG里有几条稍微没太理解,看了您最后那段的代码豁然开朗啊,哈哈哈多谢
溪夜 2020-08-01