Python学习笔记 - 使用PySimpleGUI模块开发图形用户界面(完整)

- 编辑:admin - 点击数:495

Python学习笔记 - 使用PySimpleGUI模块开发图形用户界面(完整)

一、用户界面及图形用户界面库简介

1、用户界面简介

用户界面分为命令行用户界面和图形用户界面,是人机交互的重要手段。

命令行用户界面:CommandlineUserInterface(简称CUI),一般不支持鼠标,需要通过键盘输入指令,例如Windows系统的终端命令窗口、Python的运行和控制台窗口等。

很显然,图形用户界面要比命令行用户界面更直观、操作更便捷,所以开发完整的Python项目必须要设计一个功能完备并且漂亮的图形界面。

2、常用图形用户界面库简介

Python中常用的图形用户界面库有Thinker、PyQt、PySide2、WxPython和PySimpleGUI等,各具特色,下面简单介绍一下。

Thinker:Python官方自带的图形界面库
优点:不需要安装,导入就可以使用;语法结构简单,易于掌握。
缺点:没有界面设计器概念,所有控件的尺寸和位置调整都需要使用语句重复罗列,代码冗长,尤其不利于后期调整及维护。

PyQt:第三方公司开发的图形界面库
优点:拥有QT设计器,可以通过可视化方式创建界面,拖拉控件即可完成界面设计。
缺点:PyQt不是Python官方开发的,因此商业化应用受到一定限制,必须遵守开源协议即GPLv3许可证。简单的说就是项目交付给甲方时需要附带源代码,它的替代产品是PySide2。二者功能和语法几乎相同,但是PySide2是Python官方开发的,因此使用时不受限制。另外,PyQt设计界面生成的代码量比较大。

WxPython:采用c++编写的第三方库,也是主流图形用户界面库之一。

PySimpleGUI:封装了多个图形界面库的模块,功能强大,使用前需要安装。
优点:PySimpleGUI体系封装了Thinker、Qt、WxPython和Remi,因此可以获得所有的控件元素,例如按钮、弹窗、滑块和下拉菜单等;在布局设计上,采用了更简单更人性化的方法,代码量非常少,易于后期维护;另外,PySimpleGUI使用了比较宽松的公共许可证——LGPL3。

二、PySimpleGUI模块基本应用

1、基本步骤

导入库:importPySimpleGUIassg,简写sg是约定成俗的写法

定义布局layout:layout是一个二维列表,外层列表里面包含多个内层列表,每个内层列表就是图形用户界面上的一行,包含这一行的所有控件定义

创建窗口对象:使用PySimpleGUI的Window类创建一个窗口对象,参数包括窗口标题、布局layout等

事件循环:利用whileTrue进行无限循环,避免窗口一闪即关,同时反复读取窗口对象的事件和数据,然后进行判断处理

关闭窗口对象:使用close方法变比窗口对象,释放资源

模版代码如下:

3、Window类属性

Window(title,布局设定location=(None,None),窗口宽高设定element_padding=None,按钮元素颜色设定(文本颜色,背景颜色)font=None,背景颜色设定auto_close=False,默认为3秒,自动关闭前界面持续打开时间no_titlebar=False,拖拽窗口设定。keep_on_top=False,如果为True,界面生成后可以调整大小disable_close=False,如果为True,窗口最小化按钮将不起作用right_click_menu=None,界面透明设定=_background_color()element_justification="left",设置主题为'Green'layout=[[('请输入学生信息:')],[('姓名'),()],[('性别'),('男')],[('确定'),('取消')]]window=('自定义主题',layout)whileTrue:event,values=()ifeventisNone:()

运行效果如下图:

【技巧】如果设置主题语句的参数为空字符串,即(''),则会随机设置主题,每次运行程序主题都不一样,并且在pycharm的运行窗口里还会显示有效主题列表和当前正在使用的主题名称。反复运行程序,发现哪个主题比较相中,就可以在运行窗口里复制粘贴正在使用的主题名称。

运行窗口里的内容如下:(最下面一行后面的DarkTeal11就是当前使用的主题名称)

****validvaluesare['Black','BlueMono','BluePurple','BrightColors',……]Instead,pleaseenjoyarandomThemenamedDarkTeal11

修改预定义主题的局部设置

假设我们相中了一个主题的整体效果,但是对局部设置不太满意,例如字体颜色,那么使用相应语句就可以针对部分设置进行更改。

首先,看一下一个主题包含的内容和相应的值,代码如下:

'LightGreen3':{'BACKGROUND':'DDE0DE','SCROLL':'6D9F85'),'PROGRESS':DEFAULT_PROGRESS_BAR_COLOR,'BORDER':1,'SLIDER_DEPTH':0,'PROGRESS_DEPTH':0}

以上是一个主题所包含的所有元素及设置,对应的修改这些设置的方法如下:

theme_background_colortheme_border_widththeme_button_colortheme_element_background_colortheme_element_text_colortheme_input_background_colortheme_input_text_colortheme_progress_bar_border_widththeme_progress_bar_colortheme_slider_border_widththeme_slider_colortheme_text_color

这些方法在pycharm里输入语句_时就会自动提示,然后设置好相应的值就可以了。假设我对按钮的文字颜色white不满意,现在想修改成黑色black,那么修改语句如下:

('LightGreen3')print(_button_color())_button_color(('black','自定义函数,返回带有格式设定的按钮元素,修改这里的参数,所有按钮就都随着改变defcbtn(text):(text,pad=(0,0),size=(4,2),font=('宋体',18))str:要显示的文本。可以包含\n以实现多行。key=None,元素唯一标识符,(int,int):元素宽度,行高font=None,font='宋体'bool:元素根据文本自动调节大小enable_events=False,浮雕设计'raised','sunken','flat','ridge','solid','groove'border_width=None,文本颜色background_color=None,对齐方式:'left','right','center'pad=None,(int,int)or((int,int),(int,int))(left/right,top/bottom)or((left,right),(top,bottom))right_click_menu=None,设定后,右击此元素可以调出菜单。grab=False,str:悬浮文本,当光标置于该元素上方,会显示设定的文本。visible=Truestr更新文本background_color=None,str更新文本颜色font=None,更新元素的可见状态)

完整设置实例

importPySimpleGUIassg定义右键菜单内容r_menu=['menu',['红色文字','绿色文字','蓝色文字','背景颜色',['白色背景','黄色背景','黑色背景']]]更新文字颜色ifevent=='红色文字':window['-TXT-'].update(text_color='red')ifevent=='绿色文字':window['-TXT-'].update(text_color='green')ifevent=='蓝色文字':window['-TXT-'].update(text_color='blue')默认值设定,可以为空字符串。bool:元素禁用,密码字符,一般设置为*do_not_clear=True,如果为False,一发生事件,该输入框内的值会被清除。focus=False,如果为真,则光标显示在此输入框。disabled_readonly_background_color=None,str:元素禁用时的文本颜色设定)

设置焦点

格式:window[key].SetFocus()或window[key].set_focus()

Update方法

update(value=None,bool:更新元素的禁用状态bool:元素选中和focus或者set_focus一起试着使用吧。visible=None,str:更新输入框内的文本颜色background_color=None,光标移动文本的最后。默认显示的文本border_width=None,设定为True时,文本框只提供用户写入,窗口不读取。无返回值。reroute_stdout=False,使用cprint将内容打印到此文本框内。cprint可以设置输出文本的颜色、背景颜色和对齐方式等reroute_stderr=False,如果为True,更多数据添加到末尾时元素的内容将自动滚动focus=False,默认为True,如果设定为False,窗口读取一次,内容就会自动清除。)

Update方法

Update(value=None,元素禁用app=False,字体大小名称设定text_color=None,背景颜色设定text_color_for_value=None,更新的文本的背景颜色设定visible=None,更新文本是否自动滚动。默认不自动滚动justification=None可变参数,=None,分隔符默认为空格键text_color=None,可以简写成bcolors=None,元素的唯一标识符justification=None定义布局,多行文本框的reroute_cprint=True,可以使用cprint方法向多行文本框里输出内容,两个单行文本框设置了内容自动清除layout=[[(key='-ML-',size=(60,15),reroute_cprint=True,autoscroll=True)],[(color='black'),(key='-INPUT1-',size=(20,1),do_not_clear=False),('张三'),(color='black'),(key='-INPUT2-',size=(20,1),do_not_clear=False),('李四'),(color='black'),]]window=('多行文本框演示',layout,keep_on_top=True)whileTrue:event,values=()print(event,values)ifeventisNone:breakifevent=='张三':('张三:',values['-INPUT1-'],c=('red','yellow'),justification='l')ifevent=='李四':('李四:',values['-INPUT2-'],t='blue',justification='r')()

运行效果:

4、按钮Button

格式:(参数),可以简写成(参数)

特殊属性

Update方法

实例演示

运行效果:

6、下拉菜单Combo

格式:(参数)或(参数)或(参数)或(参数)

特殊属性

Combo(values,显示下拉菜单信息,列表或者元祖default_value=None,默认选中disabled=False,设定为True时,元素不能进行选择,也不能输入。readonly=False,更新默认选中的选项values=None,高亮显示设定的索引的文本disabled=None,更新元素是否只读font=None,更新默认选中的元素values=None,更新元素的禁用状态visible=Nonestr,选项内容group_id,默认为假,未选中)

实例演示

importPySimpleGUIassg定义选项标题txt1='请对客服进行评价:'txt2='请对物流进行评价:'layout=[[(txt1)],遍历窗口返回值字典项目fork,():ifv:ifk4:状态为真的选项序号在第二组单选框内msg2=txt2+r_list[k-4](msg1,msg2,title='评价结果')文本显示在选框旁边default=False,更新选中状态str更新选框旁边的文本background_color=None,更新元素的文本颜色disabled=None,更新元素的可见状态)

10、滑块Slider

格式:(参数)

特殊属性

Slider(range=(None,None),元素的唯一标识符规范书写key='-SLIDER-'default_value=None,滑块值变动的最小单位值tick_interval=None,方向设定水平方向或者垂直方向支持简写:'h'or'v'disable_number_display=False,边界线宽度relief=None,'raised','sunken','flat','ridge','solid','groove')

Update方法

Update(value=None,(int,int)or(float,float)disabled=None,bool)

实例演示

importPySimpleGUIassglayout=[[('Python',key='-TEXT-')],滑块位置变动,文本框的文字字号随滑块值变化ifevent=='-SLIDER-':window['-TEXT-'].update(font=(None,int(values['-SLIDER-'])))ifeventisNone:()

运行效果:

11、图片Image

格式:(参数),图片格式只能是png和gif。

四、布局容器组件介绍

1、列Column

格式:(参数),可以简写成(参数)

详细属性

Column(layout,整栏背景色size=(None,None),偶尔不工作。pad=None,如果为True,则滚动条将添加到该列vertical_scroll_only=False,右击调出菜单key=None,元素的可见状态设定justification="left",列内所有元素的对齐方式垂直对齐方式如果设定为True,可以拖拽此元素移动窗口expand_x=None,如果为True,则列将自动沿y方向扩展以填充可用空间)

演示代码

importPySimpleGUIassg创建列1的布局col_layout1=[[('请输入要播放的音乐地址:')],[(size=(20,1))],[('播放'),('停止')]]创建窗口布局layout=[[(col_layout1),(col_layout2)]]window=('test',layout)whileTrue:event,values=()ifeventisNone:()

运行效果:

2、框架Frame

格式:(参数)

特殊属性

Frame(title,strlayout,[[()]]title_location=None,有效值有12种(ewsn东西南北)默认为nwrelief="groove",raised,sunken,flat,groove,ridge,solidborder_width=None,框架内元素的对齐方式垂直对齐方式支持首字母简写)

演示代码

Python学习笔记 - 使用PySimpleGUI模块开发图形用户界面(完整)
importPySimpleGUIassg创建框架2的布局f_layout2=[[('2022年度统计表')],[([],size=(34,8))]]定义用来设置框架属性的布尔变量flag=FalsewhileTrue:event,values=()反转布尔变量的值flag=notflagifeventisNone:()

运行效果:

3、标签选项卡Tab和TabGroup

标签选项卡由标签组TabGroup里面包含几个标签Tab构成,每个Tab拥有各自的布局layout,格式与窗口layout相同。所有的标签Tab布局都设置完毕后,最后用标签组TabGroup再包裹一下,最终就构成了完整的窗口布局layout。这个组件很繁琐,写代码时一定要组织好组件与组件、层与层的结构。

TabGroup的语句格式

格式:([[('Tab1',tab1_layout,),('Tab2',tab2_layout)]])

TabGroup的特殊属性

TabGroup(layout,标签标题所处的位置righttop,rightbottom,bottomleft,bottomright,topleft,toprighttitle_color=None,所有标签背景颜色(未选中时)selected_title_color=None,选中时标签背景颜色background_color=None,边界线宽度设定)

Tab的特殊属性

Tab(title,标签内包含的布局border_width=None,容器内元素的对齐方式创建标签1的布局tab1=[[('请输入学生信息:')],[('姓名'),(size=(34,1))],[('年级'),(size=(34,1))],[('添加',size=(10,1)),('查找',size=(10,1)),('删除',size=(10,1))]]创建窗口布局,最外层是TabGroup,内层包含两个Tablayout=[[([[(title='录入信息',layout=tab1),(title='信息汇总',layout=tab2)]],selected_title_color='red')]]window=('框架演示',layout)whileTrue:event,values=()ifeventisNone:()

运行效果:

五、预设按钮介绍

1、颜色选择器ColorChooserButton

颜色选择器在使用时,窗口上必须要有一个文本输入框来接收返回的十六进制颜色值,编写程序时可以把这个文本输入框的可视属性设为假。

格式:()

特殊属性

ColorChooserButton(button_text,显示颜色码的目标元素的key)

演示代码

importPySimpleGUIassg文本输入框在接收了颜色值后触发事件,用选择的颜色值更新文本颜色ifevent=='-IN-':window['-IN-'].update(text_color=value['-IN-'])ifeventisNone:()

运行效果:

2、文件选择器FileBrowe、文件夹选择器FolderBrowse、文件另存为FileSaveAs

这三个预设按钮跟颜色选择器一样,需要文本输入框来接收返回的路径和文件名。

文件选择器格式:(参数)

文件夹选择器格式:(参数)

文件另存为格式:(参数)

特殊属性(三者基本相同)

FileBrowse(button_text="Browse",显示路径的目标元素的keyfile_types=(('ALLFiles','*.*'),),只显示指定的文件名称'text.*'initial_folder=None,按钮上显示的文本target=(key),选择日期后日历界面关闭default_date_m_d_y=(None,None,None),区域设置format="%Y-%m-%d%H:%M:%S",星期日开始位置,0表示第一列从星期日开始month_names=None,星期名,列表title="ChooseDate",没有标题板块location=(None,None),可变参数title=None,(文本颜色,背景颜色)background_color=None,弹窗上面的文本颜色auto_close=False,自动关闭窗口之前界面持续的时间(以秒为单位)custom_text=(None,None),非阻塞设定。如果为True,立即执行下一步。不需要等待用户的输入。font=None,不显示标题栏。grab_anywhere=False,如果为True,保持界面在屏幕的最前方location=(None,None),如果为True,敲打任意键盘就会关闭界面.显示图片(支持base64)modal=True除非关闭此窗口否则其他界面不能进行操作。)

2、弹窗PopupGetText

显示带有文本输入字段的弹出窗口,返回输入的文本,如果关闭或取消则返回None。

格式:(参数)或者_get_text(参数)

详细属性

PopupGetText(message,标题设定default_text="",密码字符一般设定为*size=(None,None),按钮元素的(文本颜色,背景颜色)设定background_color=None,文本颜色设定font=None,无标题栏设定grab_anywhere=False,保持该弹窗在界面的最前方location=(None,None),图片上传modal=True文本设定title=None,默认文件路径save_as=False,如果为True,可以多选。file_types=(('ALLFiles','*.*'),),直接打开文件资源管理器,不显示弹窗界面。size=(None,None),按钮元素(文本颜色,背景颜色)的设定background_color=None,文本字体颜色的设定font=None,如果为True,不显示标题栏。grab_anywhere=False,如果为True,窗口保持在界面的最前方。location=(None,None),打开咨询管理器时默认的文件夹image=None,模态窗口)

4、其它弹窗

PopupGetFolder:带有文件夹选择按钮

PopupAnnoying:没有标题栏,随意移动

PopupAutoClose:自动关闭

PopupCancel:带有Cancel按钮

PopupOKCancel:带有OK和Cancel按钮

PopupError:带有Error按钮

PopupNoButtons:无按钮

PopupNoWait:直接返回

七、菜单栏介绍

格式:(参数)

详细参数

Menu(menu_definition,独立菜单设定font=None,周围元素间隔设定key=None,菜单设计menu_def=[['File',['!NewFile','OpenFile::openkey','---','OpenFolder','Exit']],['Edit',['Paste',['Cut','Repeat',],'Undo'],],['Find',['Find','Replace']],['!Tools',['Command1','Command2','Command3','Command4']],['Help','About'],]layout=[[(menu_def,key='-MENU-')],[(key='-ML-',size=(60,10))]]window=('菜单演示',layout,keep_on_top=True)whileTrue:event,values=()print(event)ifeventisNone:()

运行效果:

PySimpleGUI模块介绍到此全部完毕,篇幅太长了,但是为了知识点的连续性,还是都放在了一个篇幅里。如有不到之处,敬请教诲。