在五分钟内创建自定义GUI。对于.exe类型的程序文件,我们可以通过鼠标左键双击打开;但是对于.py类型的Python程序,几乎没有人尝试过。对于典型的用户(非程序员类型),他们双击打开一个.exe文件并期望弹出一个交互窗口。基于Tkinter,可以通过标准Python安装提供GUI,但不太可能有很多程序会这样做。如果打开一个Python程序并进入一个GUI界面变得如此容易,以至于即使是真正的初学者也能掌握它会怎么样?会有人感兴趣并使用它吗?这个问题很难回答,因为直到今天创建自定义GUI布局并不容易。在向程序或脚本添加GUI时,功能似乎“不匹配”。真正的初学者(没有这种能力)被迫只使用命令行,而许多高级程序员(具有这种能力)不想花时间创建TkinterGUI。GUI框架Python的GUI框架有很多,其中Tkinter、wxPython、Qt和Kivy是几个主流框架。此外,还有很多在上述框架基础上封装的简化框架,如EasyGUI、PyGUI、Pyforms等。但问题是,对于初学者(这里指编程经验不超过6个月的用户)来说,即使是最简单的主流框架,也无从下手;他们也可以选择打包(简化)的框架,但创建自定义GUI布局仍然很困难甚至不可能。即使你学习了某个(简化的)框架,你也需要写很多代码。PySimpleGUI试图解决上述GUI问题,它提供了一个简单、清晰、易于理解、易于定制的GUI界面。如果使用PySimpleGUI,许多复杂的GUI只需要不到20行代码。秘诀PySimpleGUI非常适合初学者的秘诀在于它已经包含了大部分原本会由用户编写的代码。PySimpleGUI将在用户不编写代码的情况下处理按钮回调回调。对于初学者来说,几周内掌握函数的概念并不容易,要求他们理解回调函数似乎也很难。在大多数GUI框架中,布置GUI小部件通常需要编写一些代码,每个小部件至少1-2行。PySimpleGUI使用“auto-packer”技术,可以自动创建布局。因此,不再需要包或网格系统来布置GUI窗口。(LCTT译注:这里说的pack和grid都是Tkinter的layoutmanagers,另一个叫place。)***,PySimpleGUI框架有效利用Python语言特性减少用户代码量,简化GUI数据返回方式.当在表单布局中创建小部件时,无需额外代码即可将小部件部署到相应的布局中。什么是GUI?大多数GUI只做一件事:收集用户数据并将其返回。从程序员的角度来看,可以概括为如下函数调用:“保存”、“是”和“否”等)和内容输入。GUI本质上可以归结为一行代码。这正是PySimpleGUI(简单GUI模式)的工作原理。当执行命令显示GUI时,除非通过单击鼠标关闭窗口,否则不会执行任何代码。当然还有更复杂的图形用户界面,点击鼠标后窗口不会关闭;例如,机器人的远程控制界面、聊天窗口等。这种复杂的形式也可以使用PySimpleGUI创建。什么时候快速创建GUIPySimpleGUI有用?显然,当您需要GUI时。让您可以在5分钟内创建和试验GUI。创建GUI最方便的方法是从PySimpleGUI的经典示例中复制代码。具体操作过程如下:找一个最贴近你需求的GUI将经典例子中的代码复制粘贴到IDE中运行来看看书中第一个经典例子菜谱:importPySimpleGUIassg#非常基本的形式。Returnvaluesasalistform=sg.FlexForm('Simpledataentryform')#以空白formlayout=[[sg.Text('PleaseenteryourName,Address,Phone')],[sg.Text('名称',size=(15,1)),sg.InputText('名称')],[sg.Text('地址',size=(15,1)),sg.InputText('地址')],[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])运行后会打开一个中等大小的表单。如果你只是想采集一些字符串类型的值,复制上面经典例子中的代码,稍作修改即可满足你的需求。您甚至可以仅用5行代码创建自定义GUI布局。importPySimpleGUIassgform=sg.FlexForm('MyfirstGUI')layout=[[sg.Text('Enteryourname'),sg.InputText()],[sg.OK()]]button,(name,)=form.LayoutAndRead(layout)5分钟创建自定义GUI在简单布局的基础上,通过修改经典示例中的代码,可以使用PySimpleGUI在5分钟内创建自定义布局。在PySimpleGUI中,小部件称为元素。元素的名称与编码中使用的名称一致。(LCTT译注:Tkinter中使用widget一词)核心元素TextInputTextMultilineInputComboListboxRadioCheckboxSpinOutputSimpleButtonRealtimeButtonReadFormButtonProgressBarImageSliderColumn元素速记PySimpleGUI也包含两个元素速记方法。一种是元素类型名称的缩写,例如T作为Text的缩写;另一种是元素参数配置了默认值,不需要指定所有参数,例如提交按钮的默认文本是“提交”。T=TextTxt=TextIn=InputTextInput=IntputTextCombo=InputComboDropDown=InputComboDrop=InputCombo)按钮速记一些常见的按钮有速记实现,包括:FolderBrowseFileBrowseFileSaveAsSaveSubmitOKOk以上都是PySimpleGUI支持的元素。如果它不在上面的列表中,它将不会在您的窗口布局中生效。(LCTT译注:以上都是PySimpleGUI的类名、类别名或返回实例的函数,自然只能使用列表中的那些。)GUI设计模式对于GUI程序,创建和显示窗口的调用是类似的,区别在于元素的布局。设计模式代码与上面的例子基本相同,只是去掉布局:importPySimpleGUIassgform=sg.FlexForm('Simpledataentryform')#Defineyourformhere(it'salistoflists)button,values=形式。LayoutAndRead(layout)(LCTT译注:这段代码无法运行,只是为了说明每个程序都会用到的设计模式。)对于大多数GUI,其编码过程如下:"定义GUI显示GUI并获取元素的值以上过程与PySimpleGUI设计模式部分的代码一一对应。GUI布局要创建自定义GUI,首先将表单分成几行,因为表单是逐行定义的。然后,在每一行中,元素从左到右依次放置。我们得到的是一个“列表的列表”,类似下面这样:layout=[[Text('Row1')],[Text('Row2'),Checkbox('Checkbox1',OK()),Checkbox('Checkbox2'),OK()]]上面布局对应的效果如下:形成和收集用户数据。下面这行代码用于显示表单并返回采集到的数据:另一部分是包含所有用户为表单输入的值的列表。本例中,表单显示后,用户直接点击“确定”按钮,返回结果如下:button=='OK'values==[False,False]Checkbox类型元素返回True或错误的类型值。由于默认情况下未选中,因此这两个元素的值为False。显示元素的值一旦从GUI获得返回值,检查返回变量中的值是个好主意。与其使用print语句进行打印,我们还不如坚持使用GUI,并在一个窗口中输出值。(LCTT译注:考虑到Python3版本,print应该是函数而不是语句。)在PySimpleGUI中,有多种消息框可供选择。传递给消息框(函数)的数据会显示在消息框中;该函数可以接受任意数量的参数,您可以轻松显示所有您想要查看的变量。在PySimpleGUI中,最常用的消息框是MsgBox。要显示上例中的数据,只需编写一行代码:MsgBox('TheGUIreturned:',button,values)元素越多越好!此外,为了更好看,我们将采用绿色/棕褐色配色方案。将PySimpleGUI导入为sgsg.ChangeLookAndFeel('GreenTan')form=sg.FlexForm('Everythingbagel',default_element_size=(40,1))column1=[[sg.Text('Column1',background_color='#d3dfda',justification='center',size=(10,1))],[sg.Spin(values=('SpinBox1','2','3'),initial_value='SpinBox1')],[sg.Spin(values=('旋转框1','2','3'),initial_value='旋转框2')],[sg.Spin(values=('旋转框1','2','3'),initial_value='SpinBox3')]]layout=[[sg.Text('一种形式的所有图形小部件!',size=(30,1),font=("Helvetica",25))],[sg.Text('这是一些文本......和一个输入文本的地方')],[sg.InputText('这是我的文本')],[sg.Checkbox('我的第一个复选框!'),sg.Checkbox('Mysecondcheckbox!',default=True)],[sg.Radio('MyfirstRadio!',"RADIO1",default=True),sg.Radio('MysecondRadio!',"RADIO1")],[sg.Multiline(default_text='如果您决定不输入任何内容,这是默认文本',size=(35,3)),sg.Multiline(default_text='Asecondmulti-line',size=(35,3))],[sg.InputCombo(('Combobox1','Combobox2'),size=(20,3)),sg.Slider(range=(1,100),orientation='h',size=(34,20),default_value=85)],[sg.Listbox(values=('列表框1','列表框2','列表框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('选择文件夹',size=(35,1))],[sg.Text('你的文件夹',size=(15,1),auto_size_text=False,justification='right'),sg.InputText('默认文件夹'),sg.FolderBrowse()],[sg.Submit(),sg.Cancel()]]button,values=form.LayoutAndRead(layout)sg.MsgBox(button,values)还有在上面写了很多代码,但是如果你尝试直接使用Tkinter框架实现相同的GUI,你很快就会发现PySimpleGUI版本是多么简洁最后一行代码打开了一个消息框,效果如下:消息框函数中每个参数的内容都会单独打印一行。本例中的消息框包含两行,第二行很长并且包含嵌套列表。建议花点时间将以上结果与GUI中的元素进行比较,以便您更好地理解这些结果是如何生成的。向您的程序或脚本添加GUI如果您有一个从命令行使用的脚本,添加GUI并不一定意味着完全放弃该脚本。一个简单的解决方案如下:如果脚本不需要命令行参数,那么可以直接使用GUI调用脚本;否则,脚本将照常运行。只需要类似于以下的逻辑:iflen(sys.argv)==1:#collectargumentsfromGUIelse:#collectargumentsfromsys.argv创建和运行GUI最方便的方法是复制一份来自PySimpleGUI经典实例的代码和修改。快来试试吧!为您一直难以手动执行的脚本添加一些趣味。只需5-10分钟即可试用示例脚本。您可能会找到一个几乎可以满足您需求的经典示例;如果没有,自己写一个也很容易。就算真的玩不下去,也只是浪费5-10分钟而已。资源安装支持Tkinter的系统支持PySimpleGUI,树莓派也支持,但需要使用Python3。pipinstallPySimpleGUIDocumentationManualClassicExamplesGitHubrepository
