科技头条

用PySimpleGUI轻松为程序和脚本添加GUI

51CTO 作者:布加迪编译 2018-09-07 09:00:00 GUI PySimpleGUI Python

用PySimpleGUI轻松为程序和脚本添加GUI

【51CTO.com快译】很少有人通过像双击.exe文件那样双击.py文件来运行Python程序。普通用户(非程序员)双击.exe文件时,认为应该弹出可与之交互的窗口。虽然可以使用tkinter借助标准的Python安装来创建GUI,但是许多程序不太可能这样。

1.GUI框架

市面上不缺面向Python的GUI框架。Tkinter、WxPython、Qt和Kivy是几个主要的软件包。此外,还有大量简化版GUI软件包可“包装”其中一个主要软件包,包括EasyGUI、PyGUI和Pyforms。

问题是,初学者连最简单的主要软件包都学不会。这使得包装程序包成为一种潜在的选择,但对于大多数新用户来说,构建自定义GUI布局依然很困难或不可能。即便可能,包装程序包也仍需要编一页页代码。

PySimpleGUI(https://github.com/MikeTheWatchGuy/PySimpleGUI)试图通过为GUI提供一种超级简单、易于理解且易于定制的界面来克服这些GUI挑战。若使用PySimpleGUI,连许多复杂的GUI也用不了20行代码。

2.秘密

PySimpleGUI非常适合新手的原因是,该软件包含有用户通常需要编写的大部分代码。处理按钮回调的是PySimpleGUI,而不是用户的代码。初学者很难掌握函数这个概念,要求他们在头几周理解回调函数确实勉为其难。

就大多数GUI而言,安排GUI窗口组件通常需要几行代码,每个窗口组件至少一两行。 PySimpleGUI使用自动创建布局的“自动打包程序”。布局GUI窗口无需pack或grid系统。

最后,PySimpleGUI以巧妙的方式利用Python语言构件,减少代码数量,简单直观地返回GUI数据。用表单布局创建窗口组件时,它已配置到位,无需编写多行代码。

3.GUI是什么?

大多数GUI做一件事:从用户处收集信息并返回信息。从程序员的角度来看,这可以概括为函数调用,如下所示:

button, values = GUI_Display(gui_layout)

大多数GUI需要用户点击的按钮(比如,确定、取消、保存、是或不等)以及用户输入的值。GUI的本质可以归结为一行代码。

这正是PySimpleGUI的工作原理(对于简单的GUI而言)。调用以显示GUI时,在点击关闭表单的按钮之前不执行任何操作。

有些较复杂的GUI,比如点击按钮后不关闭的GUI。包括面向机器人的远程控制界面和聊天窗口。这些复杂的表单也可以用PySimpleGUI来创建。

4.快速创建GUI

PySimpleGUI何时有用?只要你需要GUI就有用。创建和尝试GUI用不了5分钟。创建GUI的最快方法是从PySimpleGUI Cookbook(https://pysimplegui.readthedocs.io/en/latest/cookbook/)复制一个。遵照这些步骤:

  • 找到类似你想创建的GUI的一个GUI。
  • 从Cookbook复制代码。
  • 粘贴到你的IDE,并运行。

不妨看看来自Cookbook的第一个recipe。

 
  1. import?PySimpleGUI?as?sg??
  2. #?Very?basic?form.??Return?values?as?a?list??
  3. form?=?sg.FlexForm('Simple?data?entry?form')??#?begin?with?a?blank?form??
  4. layout?=?[??
  5. ??????????[sg.Text('Please?enter?your?Name,?Address,?Phone')],??
  6. ??????????[sg.Text('Name',?size=(15,?1)),?sg.InputText('name')],??
  7. ??????????[sg.Text('Address',?size=(15,?1)),?sg.InputText('address')],??
  8. ??????????[sg.Text('Phone',?size=(15,?1)),?sg.InputText('phone')],??
  9. ??????????[sg.Submit(),?sg.Cancel()]??
  10. ?????????]??
  11. button,?values?=?form.LayoutAndRead(layout)??
  12. print(button,?values[0],?values[1],?values[2])?

它是大小合适的表单。

图1:PySimpleGUI数据输入表单

如果你只需要收集几个值,它们又都是字符串,可以复制这个recipe,根据你的要求来修改。

你甚至可以仅用5行代码来创建自定义GUI布局。

 
  1. import?PySimpleGUI?as?sg??
  2. form?=?sg.FlexForm('My?first?GUI')??
  3. layout?=?[?[sg.Text('Enter?your?name'),?sg.InputText()],??
  4. ???????????[sg.OK()]?]??
  5. button,?(name,)?=?form.LayoutAndRead(layout)??

图2:仅用5行代码的PySimpleGUI表单

5.5分钟内创建自定义GUI

如果你有简单的布局,应该用不了5分钟,就能够用PySimpleGUI创建自定义布局,只要修改来自Cookbook的代码。

窗口组件在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窗口组件。如果某个不在这些列表上,它不会进入表单布局。

6.GUI设计模式

GUI中往往不变的元素是创建和显示窗口的调用。元素的布局因程序而异。

下面是上述例子的代码,布局已去除:

 
  1. import?PySimpleGUI?as?sg??
  2. form?=?sg.FlexForm('Simple?data?entry?form')??
  3. #?Define?your?form?here?(it's?a?list?of?lists)??
  4. button,?values?=?form.LayoutAndRead(layout)?

大多数GUI的流程如下:

  • 创建表单对象
  • 将GUI定义成列表清单
  • 显示GUI,获得结果

7.GUI布局

想创建自定义GUI,先将表单细分成几行,因为表单每次定义一行。然后将一个元素放在另一个后面,按从左到右的顺序。

结果是看起来是这样的“列表清单”:

 
  1. layout?=?[??[Text('Row?1')],?[Text('Row?2'),?Checkbox('Checkbox?1',?OK()),?Checkbox('Checkbox?2'),?OK()]?]?

这个布局生成这个窗口:

图3:PySimpleGUI自定义数据输入表单

8.显示GUI

一旦完成了布局,并复制了创建和显示表单的代码行,现在可以显示表单,并从用户处获得值。

这行代码显示表单并提供结果:

 
  1. button,?values?=?form.LayoutAndRead(layout)?

表单返回两个值:所点击按钮的文本和用户输入到表单的值列表。

如果示例表单已显示,用户只是点击了“确定”按钮,结果会是如此:

 
  1. button?==?'OK'??
  2. values?==?[False,?False]?

复选框元素返回True或False的值。由于复选框默认情况下未勾选,返回的两个值都是False。

9.显示结果

一旦你有了来自GUI的值,可以核实变量中有什么值。不是使用print语言将它们输出,不妨坚持使用GUI、将数据输出到窗口。

PySimpleGUI有好多消息框可供选择。传递到消息框的数据在窗口中显示。该函数接受众多变量。你只要表明想在调用中看到的所有变量。

PySimpleGUI中最常用的消息框是MsgBox。为了显示前一个示例的结果,编写:

 
  1. MsgBox('The?GUI?returned:',?button,?values)?

10.统统组合起来

你已知道了基本面,不妨组建一个含有PySimpleGUI尽可能多元素的表单。另外为了有漂亮的外观,我们将“look and feel”改成绿色和棕黄色颜色方案。

 
  1. import?PySimpleGUI?as?sg??
  2. sg.ChangeLookAndFeel('GreenTan')??
  3. form?=?sg.FlexForm('Everything?bagel',?default_element_size=(40,?1))??
  4. column1?=?[[sg.Text('Column?1',?background_color='#d3dfda',?justification='center',?size=(10,1))],??
  5. ???????????[sg.Spin(values=('Spin?Box?1',?'2',?'3'),?initial_value='Spin?Box?1')],??
  6. ???????????[sg.Spin(values=('Spin?Box?1',?'2',?'3'),?initial_value='Spin?Box?2')],??
  7. ???????????[sg.Spin(values=('Spin?Box?1',?'2',?'3'),?initial_value='Spin?Box?3')]]??
  8. layout?=?[??
  9. ????[sg.Text('All?graphic?widgets?in?one?form!',?size=(30,?1),?font=("Helvetica",?25))],??
  10. ????[sg.Text('Here?is?some?text....?and?a?place?to?enter?text')],??
  11. ????[sg.InputText('This?is?my?text')],??
  12. ????[sg.Checkbox('My?first?checkbox!'),?sg.Checkbox('My?second?checkbox!',?default=True)],??
  13. ????[sg.Radio('My?first?Radio!?????',?"RADIO1",?default=True),?sg.Radio('My?second?Radio!',?"RADIO1")],??
  14. ????[sg.Multiline(default_text='This?is?the?default?Text?should?you?decide?not?to?type?anything',?size=(35,?3)),??
  15. ?????sg.Multiline(default_text='A?second?multi-line',?size=(35,?3))],??
  16. ????[sg.InputCombo(('Combobox?1',?'Combobox?2'),?size=(20,?3)),??
  17. ?????sg.Slider(range=(1,?100),?orientation='h',?size=(34,?20),?default_value=85)],??
  18. ????[sg.Listbox(values=('Listbox?1',?'Listbox?2',?'Listbox?3'),?size=(30,?3)),??
  19. ?????sg.Slider(range=(1,?100),?orientation='v',?size=(5,?20),?default_value=25),??
  20. ?????sg.Slider(range=(1,?100),?orientation='v',?size=(5,?20),?default_value=75),??
  21. ?????sg.Slider(range=(1,?100),?orientation='v',?size=(5,?20),?default_value=10),??
  22. ?????sg.Column(column1,?background_color='#d3dfda')],??
  23. ????[sg.Text('_'??*?80)],??
  24. ????[sg.Text('Choose?A?Folder',?size=(35,?1))],??
  25. ????[sg.Text('Your?Folder',?size=(15,?1),?auto_size_text=False,?justification='right'),??
  26. ?????sg.InputText('Default?Folder'),?sg.FolderBrowse()],??
  27. ????[sg.Submit(),?sg.Cancel()]??
  28. ?????]??
  29. button,?values?=?form.LayoutAndRead(layout)??
  30. sg.MsgBox(button,?values)?

看起来代码好多,但是试着直接用tkinter编写同样的GUI布局,你很快意识到代码是何等少。

图4:PySimpleGUI高级自定义数据输入表单

最后一行代码打开消息框。 这就是它的样子:

图5:PySimpleGUI自定义消息框

消息框调用的每个参数都在一个新的行上显示。消息框中有两行文本;第二行很长,包了好多次。

花点时间将结果值与GUI配对,了解如何创建和返回结果。

11.将GUI添加到程序或脚本

如果你有一个使用命令行的脚本,不必为了添加GUI而丢弃它。一个简单的办法是,如果命令行上给出零参数,就运行GUI。 否则,执行命令行。

只需要这种逻辑:

 
  1. if?len(sys.argv)?==?1:??
  2. ????????#?collect?arguments?from?GUI??
  3. else:??
  4. ????#?collect?arguements?from?sys.argv?

想尽快创建并运行GUI,最简单的方法就是,从PySimpleGUI Cookbook(https://pysimplegui.readthedocs.io/en/latest/cookbook/)复制一个recipe并修改。

原文标题:Add GUIs to your programs and scripts easily with PySimpleGUI,作者:Mike Barnett??

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】