很少有人像运行 .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 条评论