很少有人像双击 .exe 文件一样双击 .py 文件来运行 Python 程序。当典型的用户(非程序员类型)双击 .exe 文件时,他们期望它弹出一个可以与之交互的窗口。虽然使用标准的 Python 安装可以使用 tkinter 创建 GUI,但很少有程序这样做。
如果将 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 条评论