很少有人像双击 .exe 文件一样双击 .py 文件来运行 Python 程序。当典型用户(非程序员类型)双击 .exe 文件时,他们希望它弹出一个他们可以与之交互的窗口。虽然使用 tkinter 的 GUI 在标准 Python 安装中是可能的,但很少有程序这样做。
如果将 Python 程序打开到 GUI 中如此简单,以至于完全的初学者都可以做到,会怎么样?会有人在意吗?会有人使用它吗?这很难回答,因为迄今为止,构建自定义 GUI 并不容易。
在为 Python 程序/脚本添加 GUI 的能力方面似乎存在差距。完全的初学者只能使用命令行,而许多高级程序员不想花费所需的时间来编写 tkinter GUI。
GUI 框架
Python 的 GUI 框架不乏。Tkinter、WxPython、Qt 和 Kivy 是几个主要的软件包。此外,还有许多简化的 GUI 软件包“包装”了主要的软件包之一,包括 EasyGUI、PyGUI 和 Pyforms。
问题在于,初学者(经验少于六周的人)甚至无法学习最简单的主要软件包。这使得包装器软件包成为潜在的选择,但对于大多数新用户来说,构建自定义 GUI 布局仍然很困难或不可能。即使有可能,包装器仍然需要大量的代码。
PySimpleGUI 试图通过提供一个超级简单、易于理解的 GUI 界面来应对这些 GUI 挑战,该界面可以轻松自定义。即使是许多复杂的 GUI,当使用 PySimpleGUI 时,也只需要不到 20 行代码。
秘密
PySimpleGUI 对于新手来说更出色的原因是,该软件包包含了用户通常需要编写的大部分代码。按钮回调由 PySimpleGUI 处理,而不是用户的代码。初学者很难掌握函数的概念,而期望他们在最初几周内理解回调函数则有些牵强。
对于大多数 GUI,排列 GUI 小部件通常需要多行代码……每个小部件至少一到两行代码。PySimpleGUI 使用“自动打包器”,它可以自动创建布局。无需 pack 或 grid 系统即可布局 GUI 窗口。
最后,PySimpleGUI 以巧妙的方式利用 Python 语言结构,从而缩短了代码量,并以直接的方式返回 GUI 数据。当在表单布局中创建小部件时,它会在适当的位置配置,而不是在几行代码之外。
什么是 GUI?
大多数 GUI 做一件事:从用户那里收集信息并返回它。从程序员的角度来看,这可以概括为一个函数调用,如下所示
button, values = GUI_Display(gui_layout)
大多数 GUI 的期望是单击的按钮(例如,确定、取消、保存、是、否等)和用户输入的值。GUI 的本质可以归结为一行代码。
这正是 PySimpleGUI 的工作方式(对于简单的 GUI)。当调用显示 GUI 时,在单击关闭表单的按钮之前,不会执行任何操作。
还有更复杂的 GUI,例如那些在单击按钮后不会关闭的 GUI。示例包括机器人的远程控制界面和聊天窗口。这些复杂的表单也可以使用 PySimpleGUI 创建。
制作快速 GUI
何时 PySimpleGUI 有用?立即,只要您需要 GUI。创建和尝试 GUI 不到五分钟。制作 GUI 的最快方法是从 PySimpleGUI Cookbook 中复制一个。按照以下步骤操作
- 找到一个看起来类似于您要创建的 GUI
- 从 Cookbook 复制代码
- 将其粘贴到您的 IDE 中并运行它
让我们看一下本书中的第一个食谱。
import PySimpleGUI as sg
# Very basic form. Return values as a list
form = sg.FlexForm('Simple data entry form') # begin with a blank form
layout = [
[sg.Text('Please enter your Name, Address, Phone')],
[sg.Text('Name', size=(15, 1)), sg.InputText('name')],
[sg.Text('Address', size=(15, 1)), sg.InputText('address')],
[sg.Text('Phone', size=(15, 1)), sg.InputText('phone')],
[sg.Submit(), sg.Cancel()]
]
button, values = form.LayoutAndRead(layout)
print(button, values[0], values[1], values[2])
这是一个相当大的表单。

如果您只需要收集几个值,并且它们基本上都是字符串,则可以复制此食谱并对其进行修改以满足您的需求。
您甚至可以在五行代码中创建一个自定义 GUI 布局。
import PySimpleGUI as sg
form = sg.FlexForm('My first GUI')
layout = [ [sg.Text('Enter your name'), sg.InputText()],
[sg.OK()] ]
button, (name,) = form.LayoutAndRead(layout)

在五分钟内创建一个自定义 GUI
如果您有一个简单的布局,您应该能够在不到五分钟的时间内通过修改 Cookbook 中的代码在 PySimpleGUI 中创建一个自定义布局。
小部件在 PySimpleGUI 中称为元素。这些元素的拼写与您在 Python 代码中键入它们的方式完全相同。
核心元素
Text
InputText
Multiline
InputCombo
Listbox
Radio
Checkbox
Spin
Output
SimpleButton
RealtimeButton
ReadFormButton
ProgressBar
Image
Slider
Column
快捷方式列表
PySimpleGUI 也有两种类型的元素快捷方式。一种类型只是完全相同元素(例如,T
而不是 Text
)的其他名称。第二种类型使用特定设置配置元素,从而避免您指定所有参数(例如,Submit
是一个文本为“Submit”的按钮)
T = Text
Txt = Text
In = InputText
Input = IntputText
Combo = InputCombo
DropDown = InputCombo
Drop = InputCombo
按钮快捷方式
许多常用按钮已实现为快捷方式。这些包括
FolderBrowse
FileBrowse
FileSaveAs
Save
Submit
OK
Ok
Cancel
Quit
Exit
Yes
No
还有更多通用按钮功能的快捷方式。
SimpleButton
ReadFormButton
RealtimeButton
这些是您可以在 PySimpleGUI 中选择的所有 GUI 小部件。如果其中一个不在这些列表中,则它不会出现在您的表单布局中。
GUI 设计模式
在 GUI 中往往不会改变的东西是设置和显示窗口的调用。元素的布局是程序之间变化的东西。
以下是上面示例中删除了布局的代码
import PySimpleGUI as sg
form = sg.FlexForm('Simple data entry form')
# Define your form here (it's a list of lists)
button, values = form.LayoutAndRead(layout)
大多数 GUI 的流程是
- 创建表单对象
- 将 GUI 定义为列表的列表
- 显示 GUI 并获取结果
这些与您在 PySimpleGUI 的设计模式中看到的行与行相同。
GUI 布局
要创建自定义 GUI,首先将表单分解为行,因为表单是一次定义一行的。然后从左到右依次放置一个元素。
结果是一个“列表的列表”,看起来像这样
layout = [ [Text('Row 1')],
[Text('Row 2'), Checkbox('Checkbox 1', OK()), Checkbox('Checkbox 2'), OK()] ]
此布局生成此窗口

显示 GUI
完成布局并复制了设置和显示表单的代码行后,就可以显示表单并从用户那里获取值了。
这是显示表单并提供结果的代码行
button, values = form.LayoutAndRead(layout)
表单返回两个值:单击的按钮的文本和用户输入到表单中的值列表。
如果显示示例表单,并且用户除了单击确定按钮之外什么都不做,则结果将是
button == 'OK'
values == [False, False]
复选框元素返回 True 或 False 值。由于复选框默认为未选中,因此返回的两个值均为 False。
显示结果
从 GUI 获取值后,最好检查变量中有什么值。与其使用 print
语句打印出来,不如坚持 GUI 的想法并将数据输出到窗口。
PySimpleGUI 有许多消息框可供选择。传递到消息框的数据显示在窗口中。该函数接受任意数量的参数。您可以简单地指示您想在调用中看到的所有变量。
PySimpleGUI 中最常用的消息框是 MsgBox。要显示上一个示例的结果,请编写
MsgBox('The GUI returned:', button, values)
将它们放在一起
现在您已经了解了基础知识,让我们将尽可能多的 PySimpleGUI 元素组合成一个表单。此外,为了使其外观更好,我们将“外观”更改为绿色和棕褐色配色方案。
import PySimpleGUI as sg
sg.ChangeLookAndFeel('GreenTan')
form = sg.FlexForm('Everything bagel', default_element_size=(40, 1))
column1 = [[sg.Text('Column 1', background_color='#d3dfda', justification='center', size=(10,1))],
[sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 1')],
[sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 2')],
[sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 3')]]
layout = [
[sg.Text('All graphic widgets in one form!', size=(30, 1), font=("Helvetica", 25))],
[sg.Text('Here is some text.... and a place to enter text')],
[sg.InputText('This is my text')],
[sg.Checkbox('My first checkbox!'), sg.Checkbox('My second checkbox!', default=True)],
[sg.Radio('My first Radio! ', "RADIO1", default=True), sg.Radio('My second Radio!', "RADIO1")],
[sg.Multiline(default_text='This is the default Text should you decide not to type anything', size=(35, 3)),
sg.Multiline(default_text='A second multi-line', size=(35, 3))],
[sg.InputCombo(('Combobox 1', 'Combobox 2'), size=(20, 3)),
sg.Slider(range=(1, 100), orientation='h', size=(34, 20), default_value=85)],
[sg.Listbox(values=('Listbox 1', 'Listbox 2', 'Listbox 3'), size=(30, 3)),
sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=25),
sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=75),
sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=10),
sg.Column(column1, background_color='#d3dfda')],
[sg.Text('_' * 80)],
[sg.Text('Choose A Folder', size=(35, 1))],
[sg.Text('Your Folder', size=(15, 1), auto_size_text=False, justification='right'),
sg.InputText('Default Folder'), sg.FolderBrowse()],
[sg.Submit(), sg.Cancel()]
]
button, values = form.LayoutAndRead(layout)
sg.MsgBox(button, values)
这看起来似乎有很多代码,但尝试直接在 tkinter 中编写相同的 GUI 布局,您会很快意识到它有多么小。

最后一行代码打开一个消息框。它的外观如下

消息框调用的每个参数都显示在新行中。消息框中有两行文本;第二行很长,并且换行了很多次
花点时间将结果值与 GUI 配对,以了解如何创建和返回结果。
向您的程序或脚本添加 GUI
如果您的脚本使用命令行,则不必为了添加 GUI 而放弃它。一个简单的解决方案是,如果在命令行上没有给出任何参数,则运行 GUI。否则,像今天一样执行命令行。
这种逻辑就是所需要的
if len(sys.argv) == 1:
# collect arguments from GUI
else:
# collect arguements from sys.argv
快速启动并运行 GUI 的最简单方法是从 PySimpleGUI Cookbook 中复制和修改一个食谱。
玩得开心!为您厌倦手动运行的脚本增添趣味。花 5 或 10 分钟玩一下演示脚本。您可能会发现已经存在一个完全符合您需求的脚本。如果没有,您会发现创建自己的脚本很简单。如果您真的迷路了,您只投入了 10 分钟。
资源
安装
PySimpleGUI 在运行 tkinter 的所有系统上运行,包括 Raspberry Pi,并且需要 Python 3
pip install PySimpleGUI
24 条评论