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

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

首页枪战射击CS1.6XGO手机版更新时间:2024-04-26

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

1、用户界面简介

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

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

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

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


二、PySimpleGUI模块基本应用

1、基本步骤

模版代码如下:

# 导入库 import PySimpleGUI as sg # 定义布局 layout = [ [sg.Text('请输入学生信息:')], # 窗口第一行只有一个文本框,文本框语句可以简写成sg.T [sg.Text('姓名'), sg.InputText()], # 第二行有一个文本框和一个文本输入框,文本输入框语句可以简写成sg.In [sg.Text('性别'), sg.InputText('男')], # 第三行同上,文本输入框语句可以有默认值 [sg.Button('确定'), sg.Button('取消')] # 第四行有两个按钮,按钮语句可以简写成sg.B ] # 创建窗口对象,窗口标题是“图形窗口模版”,把布局列表layout传进去 window = sg.Window('图形窗口模版', layout) # 主程序体,事件循环 while True: # 循环读窗口,把发生的事件和输入的数据赋值给event和values # values是一个字典,默认key是从0开始的数字序列 event, values = Window.read() # 判断确定按钮事件,输出文本输入框的内容 if event == '确定': print(values) # 判断窗口关闭按钮事件,退出循环。 # 窗口关闭事件的检测是必须要有的,否则就是点击窗口上的关闭按钮也不起作用。 # 如果用鼠标点击窗口的关闭按钮,事件就是None if event == None: break # 关闭窗口对象 window.close()

注意:所有控件都是调用的类,因此首字母都是大写的,例如sg.Text,窗口对象同样。

运行结果:

2、相关内容扩展

# 导入库 import PySimpleGUI as sg # 定义布局 layout = [ # enable_events参数是设置是否允许该组件产生事件 # 参数key是组件的关键字,设置key后,在取窗口事件和数据时就可以写成event==key值和values[key值]的形式 # 设置key,看着更直观,不容易出错。另外如果窗口组件过多,再用索引值取窗口数据内容就不方便记忆 [sg.Text('请输入学生信息:', key='-Msg-', enable_events=True)], [sg.Text('姓名'), sg.InputText(key='-In_Name-')], # key值'-In_Name-'是约定成俗的写法,有助于区分,一般单词第一个字母大写 [sg.Text('性别'), sg.InputText('男')], [sg.Button('功能1'), sg.Button('功能2'), sg.Button('1-内容'), sg.Button('2-内容')], [sg.Button('确定'), sg.Button('取消')] ] # 创建窗口对象 window = sg.Window('图形窗口模版', layout) # 主程序体,循环 while True: event, values = window.read() # 由于“请输入学生信息”文本框参数enable_events=True,所以单击后就会产生事件 # 这里使用layout里定义的key来识别更方便 if event == '-Msg-': sg.popup('请输入学生信息') # 弹窗信息 # 确定按钮事件,弹窗输出文本输入框的内容 # 读取窗口得到的返回值values是一个字典,默认要这样取值:values[0]、values[1]…… # 如果窗口组件太多,用序号取值很不直观,可以使用在layout里定义的key来取值 if event == '确定': sg.popup('学生姓名是:', values['-In_Name-']) # 事件以XX开头 if event.startswith('功能'): sg.popup('您点击了功能**按钮!') # 事件以XX结尾 if event.endswith('内容'): sg.popup('您点击了**内容按钮!') # 判断窗口关闭和点击取消按钮事件,退出循环 if event in (None, '取消'): # 也可以写成(sg.WIN_CLOSED, '取消') break # 关闭窗口对象 window.close()

3、Window类属性

Window( title, # 窗口标题设定 layout=None, # 布局设定 location=(None, None), # 默认窗口出现的位置 size=(None, None), # 窗口宽高设定 element_padding=None, # 元素间间隔设定 button_color=None, # 按钮元素颜色设定(文本颜色,背景颜色) font=None, #(字体名称,字体大小) background_color=None, # 背景颜色设定 auto_close=False, # 界面自动关闭设定 auto_close_duration=3, # 默认为3秒,自动关闭前界面持续打开时间 no_titlebar=False, # 界面无标题栏设定 grab_anywhere=False, # 拖拽窗口设定。 keep_on_top=False, # 如果为True,界面保持在屏幕的最前方 resizable=False, # 如果为True,界面生成后可以调整大小 disable_close=False, # 如果为True,窗口关闭按钮将不起作用 disable_minimize=False, # 如果为True,窗口最小化按钮将不起作用 right_click_menu=None, # 右击调出菜单 transparent_color=None, # 界面透明设定 =sg.theme_background_color() element_justification="left", # 元素对齐方式设定。有效值 left,right,center )

4、自定义主题

PySimpleGUI模块自带了上百套主题,主题里预定义了窗口背景颜色、字体颜色、组件边框效果等等,可以使用相应语句预览主题和打印有效主题名称列表。

输入如下代码:

import PySimpleGUI as sg sg.theme_previewer()

运行效果如下图:

PySimpleGUI模块预定义主题

默认主题是:Dark Blue 3,即深蓝 3。

上面输出的主题预览图里的主题并不全,并且有些还是无效的,在使用时可以先输出有效主题列表,然后通过复制粘贴就可以很方便的引用了。代码如下:

import PySimpleGUI as sg print(sg.theme_list()) 输出结果: ['Black', 'BlueMono', 'BluePurple', 'BrightColors', 'BrownBlue', 'Dark', 'Dark2', ……] 注:因为列表内容太多,所以这里用省略号代替。

格式:sg.theme(主题名称),演示代码如下:

import PySimpleGUI as sg sg.theme('Green') # 设置主题为'Green' layout = [ [sg.Text('请输入学生信息:')], [sg.Text('姓名'), sg.InputText()], [sg.Text('性别'), sg.InputText('男')], [sg.Button('确定'), sg.Button('取消')] ] window = sg.Window('自定义主题', layout) while True: event, values = window.read() if event is None: break window.close()

运行效果如下图:

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

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

** Warning - Theme is not a valid theme. Change your theme call. ** valid values are ['Black', 'BlueMono', 'BluePurple', 'BrightColors',……] Instead, please enjoy a random Theme named DarkTeal11

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

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

'LightGreen3': {'BACKGROUND': '#A8C1B4', 'TEXT': 'black', 'INPUT': '#DDE0DE', 'SCROLL': '#E3E3E3', 'TEXT_INPUT': 'black', 'BUTTON': ('white', '#6D9F85'), 'PROGRESS': DEFAULT_PROGRESS_BAR_COLOR, 'BORDER': 1, 'SLIDER_DEPTH': 0, 'PROGRESS_DEPTH': 0}

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

theme_background_color theme_border_width theme_button_color theme_element_background_color theme_element_text_color theme_input_background_color theme_input_text_color theme_progress_bar_border_width theme_progress_bar_color theme_slider_border_width theme_slider_color theme_text_color

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

sg.theme('LightGreen3') print(sg.theme_button_color()) sg.theme_button_color(('black','#6D9F85'))

注:首先设置主题,然后打印输出按钮的颜色,为的是取得按钮的背景颜色,最后修改按钮的文字颜色为black,把背景颜色复制粘贴过来。注意,修改颜色语句的参数是一个元组!

5、自动批量创建组件

对于一些特征相同、数量较多的组件,可以使用列表推导式的方式来自动批量创建,下面分三种形式演示:

import PySimpleGUI as sg layout = [[sg.Button(i) for i in '1234567890']] window = sg.Window('自动批量创建组件', layout) while True: event, values = window.read() if event is None: break window.close()

运行效果:

layout = [[sg.Button(i)] for i in '1234567890']

注意内层方括号的位置,运行效果:

import PySimpleGUI as sg sg.theme('LightYellow') # 自定义函数,返回带有格式设定的按钮元素,修改这里的参数,所有按钮就都随着改变 def cbtn(text): return sg.B(text, pad=(0, 0), size=(4, 2), font=('宋体', 18)) # 定义布局,利用列表推导式配合自定义按钮函数,自动批量创建按钮 layout = [ [cbtn(i) for i in '789'], [cbtn(i) for i in '456'], [cbtn(i) for i in '123'], [cbtn(i) for i in '%0.'], ] window = sg.Window('批量创建按钮', layout, keep_on_top=True) while True: event, values = window.read() print(event) if event is None: break window.close()

运行效果:


三、核心组件介绍

图形窗口核心组件的属性很多,但是绝大部分都是共通的,因此这里以文本框为基础进行详细介绍。

1、单行文本框Text

格式:sg.Text(参数),可以简写成sg.T(参数)

Text( text="", # str:要显示的文本。可以包含\n以实现多行。 key=None, # [str, int, tuple, object]: # 元素唯一标识符, # 书写规范 key='-NMAE-'。用于元素的定位。 size=(None, None), # (int, int): 元素宽度,行高 font=None, # 设定字体的名称,大小 # font='宋体' # font=('宋体',int) or font=['宋体',int] auto_size_text=None, # bool: 元素根据文本自动调节大小 enable_events=False, # bool: 事件属性,设定为True时,点击文本发生事件。 relief=None, # 浮雕设计 'raised','sunken','flat','ridge','solid','groove' border_width=None, # 设定relief时,用来设定边界宽度 text_color=None, # 文本颜色 background_color=None, # 文本背景颜色 justification=None, # 对齐方式: 'left','right','center' pad=None, # 元素间隔设定 记住左右上下 # (int, int) or ((int, int),(int,int)) # or (int,(int,int))or ((int, int),int) # (left/right, top/bottom) or ((left, right), (top, bottom)) right_click_menu=None, # 右击调出菜单 List[List[Union[List[str],str]]] # 设定后,右击此元素可以调出菜单。 grab=False, # bool:如果为真,点此元素可以移动拖拽窗口 tooltip=None, # str:悬浮文本 ,当光标置于该元素上方,会显示设定的文本。 visible=True # bool: 元素可见状态 )

Update方法用于在程序中更新文本框设置
格式:window[key].update() 或 window[key].Update()

可用于更新的属性如下:

update( value=None, # str 更新文本 background_color=None, # str 更新文本背景颜色 text_color=None, # str 更新文本颜色 font=None, # 更新字体的名称或者大小 visible=None # 更新元素的可见状态 )

import PySimpleGUI as sg # 定义文本框需要显示的文本 txt = '''今年以来,面对复杂严峻的国内外形势和多重超预期因素冲击, 中国经济顶住压力,前三季度国内生产总值(GDP)同比增长3%, 在上半年同比增长2.5%的基础上,持续巩固回升态势。''' # 定义右键菜单内容 r_menu = ['menu', ['红色文字', '绿色文字', '蓝色文字', '背景颜色', ['白色背景', '黄色背景', '黑色背景']]] # 定义布局 layout = [[ sg.Text( text=txt, key='-TXT-', size=(47, 3), font=('微软雅黑', 12), auto_size_text=False, enable_events=False, relief='raised', border_width=10, text_color='blue', background_color='white', justification='left', pad=((4, 4), (8, 8)), right_click_menu=r_menu, grab=True, tooltip='这是文本框!!!', visible=True)], [sg.Button('确认', font=(None, 12), size=(20, 2)), sg.Button('取消', font=(None, 12), size=(20, 2))] ] window = sg.Window('自动批量创建组件', layout) while True: event, values = window.read() # 更新文字颜色 if event == '红色文字': window['-TXT-'].update(text_color='red') if event == '绿色文字': window['-TXT-'].update(text_color='green') if event == '蓝色文字': window['-TXT-'].update(text_color='blue') # 更新背景颜色 if event == '白色背景': window['-TXT-'].update(background_color='white') if event == '黄色背景': window['-TXT-'].update(background_color='yellow') if event == '黑色背景': window['-TXT-'].update(background_color='black') if event is None: break window.close()

运行效果:

2、单行文本输入框InputText

格式:sg.InputText(参数) ,可以简写成sg.In(参数)

InputText( default_text='', # 默认值设定,可以为空字符串。 # Any disabled=False, # bool :元素禁用, # 如果为True则禁用,无法输入任何值。 password_char="", # 密码字符,一般设置为* do_not_clear=True, # bool : 输入框内容不被清除 # 如果为False,一发生事件,该输入框内的值会被清除。 focus=False, # bool : 设定焦点 # 如果为真,则光标显示在此输入框。 disabled_readonly_background_color=None, # str: 元素禁用时的背景颜色设定 disabled_readonly_text_color=None, # str: 元素禁用时的文本颜色设定 )

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

update( value=None, # str : 更新输入框内的文本 disabled=None, # bool : 更新元素的禁用状态 # 如果为True,输入框变成只读状态,无法写入。 select=None, # bool: 元素选中 # 如果为True,输入框内的文本被全选中。 # 和focus或者set_focus 一起试着使用吧。 visible=None, # bool : 更新元素的可见状态 text_color=None, # str : 更新输入框内的文本颜色 background_color=None, # str : 更新输入框的背景颜色 move_cursor_to="end" # 光标移动文本的最后。 # 和value,focus 一起试着使用吧。 )

3、多行文本框Multiline

多行文本框既可以做输入又可以做输出使用,当做输出使用时,文本内容可以设置不同颜色、对齐方式等,还可以在不清除原有内容的同时动态更新输出内容,是一个非常好用的组件,用作可视化调测程序也非常方便。

格式:sg.Multiline(参数),可以简写成sg.ML(参数)

Multiline( default_text="", # 默认显示的文本 border_width=None, # 边界线条宽度设定 write_only=False, # 设定为True时,文本框只提供用户写入,窗口不读取。无返回值。 reroute_stdout=False, # print语句内容会显示在此文本框内 reroute_cprint=False, # 使用cprint将内容打印到此文本框内。cprint可以设置输出文本的颜色、背景颜色和对齐方式等 reroute_stderr=False, # 捕捉异常时将文本写在此元素内. sys.stderr.write('?') autoscroll=False, # 如果为True,更多数据添加到末尾时元素的内容将自动滚动 focus=False, # 焦点设置 do_not_clear=True, # 默认为True,如果设定为False,窗口读取一次,内容就会自动清除。 )

Update( value=None, # 更新内容 disabled=None, # 元素禁用 append=False, # 如果设定为True,要更新的内容会接在原来文本的下方。原来的文本不会消失。 font=None, # 字体大小名称设定 text_color=None, # 文本颜色设定 background_color=None, # 背景颜色设定 text_color_for_value=None, # 更新的文本的字体颜色设定 background_color_for_value=None, # 更新的文本的背景颜色设定 visible=None, # 元素可见状态更新。默认可见 autoscroll=None, # 更新文本是否自动滚动。默认不自动滚动 justification=None # 更新文本对齐方式)

cprint( args=*<1 or N object>, # 可变参数, end=None, # 结束符 默认为回车键 sep=" ", # 分隔符 默认为空格键 text_color=None, # 可以简写成t background_color=None, # 可以简写成b colors=None, # 可以简写成c key=None, #元素的唯一标识符 justification=None #文本对齐方式)

sg.VerticalSeparator( color=None, key=None, pad=None )

import PySimpleGUI as sg # 定义布局,多行文本框的 reroute_cprint=True,可以使用cprint方法向多行文本框里输出内容,两个单行文本框设置了内容自动清除 layout = [[sg.Multiline(key='-ML-', size=(60, 15), reroute_cprint=True, autoscroll=True)], [sg.VerticalSeparator(color='black'), sg.InputText(key='-INPUT1-', size=(20, 1), do_not_clear=False), sg.B('张三'), sg.VerticalSeparator(color='black'), sg.InputText(key='-INPUT2-', size=(20, 1), do_not_clear=False), sg.B('李四'), sg.VerticalSeparator(color='black'), ]] window = sg.Window('多行文本框演示', layout, keep_on_top=True) while True: event, values = window.read() print(event, values) if event is None: break if event == '张三': sg.cprint('张三:', values['-INPUT1-'], c=('red', 'yellow'), justification='l') if event == '李四': sg.cprint('李四:', values['-INPUT2-'], t='blue', justification='r') window.close()

运行效果:

4、按钮Button

格式:sg.Button(参数),可以简写成sg.B(参数)

Button( image_filename=None, # 图片路径,按钮用图片表示 # 只支持GIFs和PNGs格式 # 和image_data二选一使用 image_data=None, # 图片base64格式,按钮用图片显示 # 和image_filename二选一使用 image_size=(None, None), # 按钮图片大小 image_subsample=None, # 图片大小设定 # 为2时→原图片的二分之一大小 # 2=1/2, 3=1/3, 4=1/4, etc disabled_button_color=None, # 按钮元素禁用时显示的按钮颜色 bind_return_key=False, # 绑定回车键 # 如果设定为True,回车键会使此元素被点击。 )

Update( text=None, # 按钮上显示的文本 button_color=(None, None), # 按钮颜色 disabled=None, # 元素禁用设定 image_data=None, # 图片的base64格式 image_filename=None, # 图片的路径 visible=None, # 元素可见状态设定 image_subsample=None, # 元素大小设定 disabled_button_color=(None, None), # 元素禁用时显示的文本和按钮颜色 image_size=None # 图片尺寸设定 )

import PySimpleGUI as sg # 确定按钮的图片地址 start = 'start.png' # 取消按钮的Base64数据,Base64数据的生成方法在实例演示下面介绍 end = b'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAALNklEQVRYhc2Ya3Rc1XWAv3PvzNU8NGNJo5Gsh5GFRrIeDoE6dbAJXUBIaULpKhBqcA2lNmmbRVfSZZzYpCUhCQHjYEwcILxsEkpJmyYkDSkPmwDlYbkxBmxZxpblB5ItWZZHGmkkzePec05/zEiasR7Y6Z/stfaPmXvuPt/ZZ9 99znwBy4CYHh/O7hc6FQK4 hRRDpNynCwjg9UMDp8kRyKRUQiWS6U9qt00hS2LRDi3GbSWmiXSwmrQGGaaS1Ev1FafMxVGNqTKi8 aBYUILRAVVYgwmFIpwk2t DKMQBCQHAOHPuo3DjY/i0ZHbxGJFPVAg2miQaEMDhnOAAhEI4EexTQCKXR0Si21RWjK/gW59etF/UNO7DcGZasuMgMB8OEIj qdee1 rXX/k2kUl7t94LLBRi5rgDN/0OyL5sGGAJtp4tEd/c1sqv7Gt3fv4Ebl63VXi k7UlAtyERxcXYb7f mf3L558XwQCiaA5ojUaTR6TPpBOZ/6RES5lZrmGCaYJxxsLyOMdBTXQgAI6N07rj62ag0Gvdsvwr43srABJH9qH6TwdSm34U045jiGAA1CxuEgK0Qg8NoeJxME1EIIDweEAY6HQKRkbQySTC68UoLga3e3abAEqi 05hrbz5KtenF23zzm/OcCa7elFvvPVtPTxsGOVlIOXMYIDs7UUridncjKe5BXdjM8a8eRh f2bbEklUXx92x0Hs/e3YbXshHsesrES4LVBqevuGAX4fqdfffMIJhebDeAyeilaonp5l2u9FqxngTBc6NoiMRilYegm a/4Ca8lSZvxcqquxFi0CIN1xkORLL5J45WXQGrOyEqRi2m0v9KP7T9cYp2PNwH4XgOzrXSJH4pVYFmJKjAEuF87xLkRhgMDadRR /uqZsKYVq2FBRj97JcOP/4jU3r24a2snoc4QLR3kyROXAvszUXysu14rlYkfrfPVNLGPHsWsqCL0w0fPGS5XPAs/QekPH8XzuT8lfagDrdTU bRGezzQcaQKslusUolSDAOtFeRummnidHdhVlYRfuRRDH/h7w03LgYQ pdvEnW5GX3hv7AikSkxqQUoJeeMj0cmEl6tyV8FIGODaLdF6UObJ AGolHeWLOaoUTirKEk0Hrv9zj06vaJ/0Lr7sS96FPYXR hhTjDiyDTSWsScGxMSK2QWiOlREqJUop0Tw9Fq9fgLi0FoOfQITq o9U/uzfab/9ywzO9LXniAPs/sEmirY Sfy7d3Pg1e3IbNyFvnk30nQhR0aQSk3MrQGZSIoJQC1lhnw8JoD0iRNYSy4hcOXnJiYb 125rz2KiWXX0Hl/nbav7SSwXR6Vrj3HtxI4danCC 9hJL 0zj/ gxOdmFWaSnBW/ WVFdXphxkPagyLJOASmuhlGJCpcQZG6XopuV5E0b /suUrVlLdM8HWLW1VLTtpe1Lq6aFdIDdmx7E MthJqaGejowFy8mIUPPkSBa7IFKLr Bozqapx4nDyGbFxmPHjGV QMDWEtXIjv4iX5swpBaPUaipavYHhfG566CFX722m7Ld TDvDuxgfwbnmScFMzsSNHKIhEqHrsCQiF8kwaXi/ yy7DOdmX50WdDYMsoMpTZyCK94JPzpiEy7 jqIVNzO0ry3jyfY29qy6lXj2 a6NG/BsfZJwcxODhzuxIhGqn3gKw Od1p7vjz6FEhotnTwOGE8z0sl7QSmHgubmGfAyMnftN1BSMvDsTwg2t1DRvpcP/3ktVJ H79mfUNrUyGBnB57GJs57aiumzz jLSsSQZQUIVOJTCnMkWy7NSlaSvD7cFXPmxUQoPIbd6EFGciFFyDfehM7maCkYQGxw4ew6uup2foM5gyeGxezuAQxpwg1OIgxHaDKQVRKglUw64pzperOuygoK6Nny5N4y8JYooShnuMEPnMpNQ89elY2TK8Xw 8n1d HC980gDmZXCuJzKaasxEN9LgsDOkglQIBppT0C5MSIHCWNqTW6Gz zZVsHlRCS4WWCrTAGUuQHh37WMMKeOf79zP83bvxVFaTPh0l2dWFWVGF8eo2dtz4RYbOIpnbiQT2cBwMk3EOLXPSjFJyUtE4QzES3R997Krfuf8 eGQTFY0NDHUcoPDTF1O64haG29sI1M6n7P1d7FyxjCHbmdVWemAAO9oPppnLklNJtJxUFELZxPd MCvcWxvug4c3Ud7cwkBnB576CPMfeIjqO9ZSeuNyonvexxepp3TXTnb89Q3EnJkhRw4dJHXqJNpl5LFMAEqt89QsKiK2exf2THDr70FtfoDwwhainR14FjTR NzzGGamQsy/ 3uUr/w7onvex7tgAaH3fkfrTdcxZE9nEQZ/1wqOjTyDZdKDSuWpEZjD2O5dnGzdkWcoBby98X7k5o2Utyxk4NAhPA2NNP30F5i /K v9lv3UL4qA mPNFCyexc7bl7G6eHhvHGjySSnX3kJT7hsCsckYLZAj6sjwGe56d7yOLnfVNvmB4l9bR1zL7qIgcOd JqaWPgfv8I1Q0qq /Z9VN56GwN738ff3IJv 0u8u3I56ZzCcPSnz6I7DqALA3kMKs D45BKoXSmULurqhh9 Td0bHt5wljjZVcw7/KlHN/ Ot4FjXziZ7/G5Z89X9bds4GK2/6Bvtd/ixUqZdHyW3CJTCMfHRzk OaNBKrn4UgnM7fOejD7fqaSFBQoPTaeVgSgsRGEyss5cucdhP54MeHiEgovuJDGZ/8TccdXaH5sC6Z39goxLpHvrCc9FKP4Ty4nfN1fAdlWbPXtBIdiqHB93klSKYVhFegJDwqvN6WySXJctZSoUClFsUF2LruWWPak76mo5JPP/Rx3cM5ZwY1L8w8eo L6ZRO/37zrToyX/xvv XVI285vtRwHLCs9AWgUeAelbU9pu2Q6TcH5dQQ/3Mf/XPsFeqPRc4KaTpLAtnVrsB9/mOKGRlLjzXKOKulguNwjE4Du82uOZh5MHZxOp/E3NFK07wN2fOEKdr/4wu8N13nwANtuuh699XHCjU2khIBpTnZydBSzpvokZGOwoGp q H3x5zYQNF0TULaTuON1FPd28OxVSvo/csbqP2bVdRfvARryuipcuzYMQ4/9wzRZ7ZSPhrH39JCUiqEklNqfuboofHMj ycAAzW1R0eOa/mhYHDnTd7/P6JOpgrdiqFCIeZX1JC7Nc/p/2V33B0yaUUL72U0AUX4quswgoEwRA4Y2MkTvURO/Ah0Z3vMPz2G/hOdFNbMx9nbjkpx572kkwIgT0UwwqHh4L19f8L2UNwf e7jB44WH1kzbpu0 PFLCwEPf39iQYMw8RyHMb6ThIbGcH2 lCBIPj9CMNAJ8YQ8TjmSJyg201w7lykz4cjFWLGPinzJNHZSdXqr64Mf/Hap8vqFmUA w68hzW3glNP//j2Y vvfdhTXZVpz6e7BskBFWSC2NAK4TjgOGitEaYL3C6UYZK5kNOImW9xQAi0UiSPHqHkqqtfrF1/79VyZJiy gszWyzsAtRAmvJltzySPn7Cf/JXv7jfcI/iCgQRpjnjjaomcyiXCHC5M5o3QOeMnX6xWknk2BgyPkJw8ZJf1vzT164zzSAymcnLmepuaJSdRCVShK68aoOrNPz2wJtvfCfd1/tZNTqK4fEgDAMMA2EImM0bHyNaq8xVhwaZTCAME7M49GHo83/ /dCSzzytbBt7cGDiUnfygCoE2raxo/34I5Edwuu7UsaHW9LxwcVjbe3VSskS7aQLVCJpKumc8yW61loYhqkMj08ZlmWjGPbX1fb6q2o 0Iar1dtQp1RiDGckTkFJKXr2FvIPR/4P264oueEDe58AAAAASUVORK5CYII=' layout = [ [sg.T('请输入信息文字:')], [sg.In(key='-INPUT-', font=(None, 14), size=(40, 1))], [sg.B(key='-OK-', image_filename=start, image_size=(40, 40), pad=((8, 18), (20, 4)), bind_return_key=True), sg.B(key='-CANCEL-', image_data=end, image_size=(40, 40), pad=((8, 18), (20, 4)))] ] window = sg.Window('图形按钮', layout) while True: event, values = window.read() if event == '-OK-': if values['-INPUT-'] == '': sg.popup('输入内容不能为空,请重新输入!') else: sg.popup(values['-INPUT-']) if event in (None, '-CANCEL-'): break window.close()

【注】确定按钮绑定了回车键,在文本输入框输入内容后直接按回车键,就相当于用鼠标点击了确定按钮,弹窗显示文本输入框的内容。

运行效果如下:

在上面的实例中,两个按钮都使用了图片,其中确定按钮采用的是调用磁盘文件的形式,而取消按钮采用了Base64格式数据的形式。Base64是Python支持的一种二进制图片格式,生成后就不再依赖原图片了,所以相比调用图片文件的好处就是不怕因图片丢失而出现错误。Base64格式数据生成方法如下:

import base64 file = open('end.png', 'rb') b64 = base64.b64encode(file.read()) print(b64) file.close()

这段简单的代码运行后就会输出指定图片的Base64数据,然后复制粘贴到需要用到的地方就可以了。

5、列表Listbox

格式:sg.Listbox(参数),可以简写成sg.LB(参数)

Listbox( values, # 列表或者元祖等 default_values=None, # 默认选中的值或者列表 select_mode=None, # 选择模式,有效值包含如下4种。 # single ,单选,更换时点击选择 # multiple ,可以多选,逐一点击选择 # browse ,单选,鼠标按住也可以更换选择 # extended ,可以多选,鼠标按住也可以扩展选择 no_scrollbar=False, # 如果为True,则没有滚动条 )

Update( values=None, # 元祖或者列表,举例如下 # values=[1,3] # values=(1,3) disabled=None, # bool : 更新元素是否禁用,举例如下 # disabled=True # disabled=False set_to_index=None, # 高亮显示设定的索引,Union[int, list, tuple],举例如下 # set_to_index=1 # set_to_index=[1,2] # set_to_index=(1,2) # 注意!单击只是高亮显示,并未选中。双击才是高亮显示 选中。 # 单击获取值时,不用valuse(key),而是window[key].get() scroll_to_index=None, # int : 将设定的索引跳到要显示第一行 select_mode=None, # 更新元素的选择模式,有效值包含如下4种 # single ,单选,更换时点击选择 # multiple ,可以多选,逐一点击选择 # browse ,单选,鼠标按住也可以更换选择 # extended ,可以多选,鼠标按住也可以扩展选择 visible=None # bool: 更新元素的可见状态 # visible=True # visible=False )

import PySimpleGUI as sg # 创建列表框内容列表 list1 = ['黄瓜', '豆角', '土豆', '茄子', '辣椒'] list2 = ['苹果', '橘子', '黄桃', '葡萄', '西瓜', '橙子', '柚子', '火龙果'] layout = [ [sg.Text('请选购物品:')], # 列表框默认显示list1的内容,多项选择,默认有滚动条 [sg.Listbox(list1, key='-LB-', size=(20, 5), select_mode='multiple')], [sg.Button('蔬菜', key='-B1-', size=(8, 1)), sg.Button('水果', key='-B2-', size=(8, 1))], [sg.Button('清空物品', key='-CLEAR-', size=(18, 1))], [sg.Button('确认', key='-OK-', size=(18, 1))] ] window = sg.Window('列表演示', layout) while True: event, values = window.read() # 如果点击了蔬菜按钮,则将list1的内容加载到列表框中 if event == '-B1-': window['-LB-'].update(list1) # 如果点击了水果按钮,则将list2的内容加载到列表框中 if event == '-B2-': window['-LB-'].update(list2) # 如果点击了清除物品按钮,则将列表框的高亮显示内容清空 if event == '-CLEAR-': window['-LB-'].update(set_to_index=[]) # 如果点击了确认按钮,则弹窗显示列表框的选择项目(返回值是列表) # 这里获取高亮显示项目的内容时,要用window[key].get(),而不能用读取窗口的values值 # 因为如果使用set_to_index设定高亮显示项目时,实际上并没有用鼠标点击,虽然相应项目可以高亮显示,但是读取窗口的values值是捕获不到的 if event == '-OK-': sg.popup('您选购的物品如下:', window['-LB-'].get()) if event is None: break window.close()

运行效果:

6、下拉菜单Combo

格式:sg.Combo(参数) 或 sg.InputCombo(参数) 或 sg.DropDown(参数) 或 sg.Drop(参数)

Combo(values, # List[Any] or Tuple[Any] # 显示下拉菜单信息,列表或者元祖 default_value=None, # initial value # 默认选中 disabled=False, # 元素禁用状态设定, # 设定为True时,元素不能进行选择,也不能输入。 readonly=False, # 元素只读属性,只能选择,不能输入内容。 )

update( value=None, # 更新默认选中的选项 values=None, # 更新显示的所有下拉菜单文本 set_to_index=None, # 高亮显示设定的索引的文本 disabled=None, # 更新元素的禁用状态 readonly=None, # 更新元素是否只读 font=None, # 更新元素的字体名称或者大小 visible=None )

7、选项菜单OptionMenu

选项菜单OptionMenu的功能与下拉菜单Combo基本相同,只是不支持输入。

格式:sg.Optionmenu(参数)

OptionMenu( values, default_value=None, )

Update( value=None, # 更新默认选中的元素 values=None, # 更新所有显示的文本选项 disabled=None, # 更新元素的禁用状态 visible=None # 更新元素的可见状态 )

8、单选框Radiobox

单选框组件可以创建一组选项,然后只能选择其中一项。不知道是Python版本问题还是PySimpleGUI版本问题,我的电脑上只有sg.Radio组件。

格式:sg.Radiobox(参数),可以简写成sg.R(参数)

Radiobox(text, # str,选项内容 group_id, # 组id default=Flase, # 默认为假,未选中 )

import PySimpleGUI as sg # 定义单选框的项目内容列表 r_list = ['非常满意', '满意', '一般', '不满意'] # 定义选项标题 txt1 = '请对客服进行评价:' txt2 = '请对物流进行评价:' layout = [ [sg.Text(txt1)], # 创建两组单选框,循环导入内容列表里面的值 [sg.Radio(i, group_id=1) for i in r_list], [sg.Text(txt2)], [sg.Radio(i, group_id=2) for i in r_list], [sg.Button('提交')] ] window = sg.Window('单选框', layout) while True: event, values = window.read() if event == '提交': msg1 = '' msg2 = '' # 遍历窗口返回值字典项目 for k, v in values.items(): if v: if k < 4: # 状态为真的选项序号在第一组单选框内 msg1 = txt1 r_list[k] '\n' else: # 状态为真的选项序号在第二组单选框内 msg2 = txt2 r_list[k - 4] sg.popup(msg1, msg2, title='评价结果') # 复位两组单选框,随便用一组里的一个序号即key即可 window[0].reset_group() window[6].reset_group() if event is None: break window.close()

运行效果:

9、复选框Checkbox

每个复选框都是独立的,不分组,拥有自己单独的key和value

格式:sg.Checkbox(参数),可以简写成sg.CB(参数)

Checkbox( text, # 文本显示在选框旁边 default=False, # bool 如果为True,则选中 )

Update( value=None, # 更新选中状态 # bool 如果为True,则选中,如果为False,则清空选中状态 text=None, # str 更新选框旁边的文本 background_color=None, # 更新元素的背景颜色 text_color=None, # 更新元素的文本颜色 disabled=None, # 更新元素的禁用状态 visible=None # 更新元素的可见状态 )

10、滑块Slider

格式:sg.Slider(参数)

Slider( range=(None, None), # 滑块范围(最小值,最大值) key=None, # 元素的唯一标识符 规范书写key='-SLIDER-' default_value=None, # 滑块初始所处位置 resolution=None, # 滑块值变动的最小单位值 tick_interval=None, # 刻度值标记 orientation=None, # 方向设定 水平方向或者垂直方向 # 有效值'horizontal' or 'vertical' # 支持简写:'h' or 'v' disable_number_display=False, # bool 默认为False,如果为True,滑块旁的数字不显示。 border_width=None, # 边界线宽度 relief=None, # 浮雕设计 # 'raised','sunken','flat','ridge','solid','groove' )

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

import PySimpleGUI as sg layout = [ [sg.Text('Python', key='-TEXT-')], # 定义滑块,范围从0到100,默认为12,每次变动1,以10位单位划刻度,横向显示,允许触发事件,尺寸为宽40高30 [sg.Slider(key='-SLIDER-', range=(0, 100), orientation='h', enable_events=True, tick_interval=10, size=(40, 30))] ] window = sg.Window('滑块演示', layout) while True: event, values = window.read() print(event, values) # 滑块位置变动,文本框的文字字号随滑块值变化 if event == '-SLIDER-': window['-TEXT-'].update(font=(None, int(values['-SLIDER-']))) if event is None: break window.close()

运行效果:

11、图片Image

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


四、布局容器组件介绍

1、列Column

格式:sg.Column(参数),可以简写成sg.Col(参数)

Column( layout, # 将在“列”容器中显示的布局 [[sg.T('hello world')]] background_color=None, # 整栏背景色 size=(None, None), # (宽度,高度)以像素为单位的尺寸( # 偶尔不工作。 pad=None, # 与周围元素间的间隔设定 左右上下 scrollable=False, # 如果为True,则滚动条将添加到该列 vertical_scroll_only=False, # 如果为True,则不会显示水平滚动条 right_click_menu=None, # 右击调出菜单 key=None, # 元素的唯一标识符 visible=True, # 元素的可见状态设定 justification="left", # 为列本身设置对齐方式 element_justification="left", # 列内所有元素的对齐方式 # 有效值为 left,center,right vertical_alignment=None, # 垂直对齐方式 # 有效值为top,bottom,center grab=None, # 如果设定为True,可以拖拽此元素移动窗口 expand_x=None, # 如果为True,则列将自动沿X方向扩展以填充可用空间 expand_y=None, # 如果为True,则列将自动沿y方向扩展以填充可用空间 )

import PySimpleGUI as sg # 定义列表框组件的内容 music_list = ['逐月', '为你写下这首歌', '风吹半夏', '找到爱', '在你的身边', '墨尔本的秋天', '暂露锋芒'] # 创建列1的布局 col_layout1 = [ [sg.Text('请输入要播放的音乐地址:')], [sg.InputText(size=(20, 1))], [sg.Button('播放'), sg.Button('停止')]] # 创建列2的布局 col_layout2 = [ [sg.Text('歌曲列表')], [sg.Listbox(music_list, size=(20, 7))]] # 创建窗口布局 layout = [[sg.Column(col_layout1), sg.Column(col_layout2)]] window = sg.Window('test', layout) while True: event, values = window.read() if event is None: break window.close()

运行效果:

2、框架Frame

格式:sg.Frame(参数)

Frame( title, # 标题文本 # str layout, # 容器内元素布局 # [[sg.In()]] title_location=None, # 标题所处位置 # 有效值有12种(ewsn 东西南北) # e,es,en,s,se,sw,w,ws,wn,n,ne,nw # 默认为nw relief="groove", # 浮雕设计 和其他元素的有效值是一样的。 # raised,sunken,flat,groove,ridge,solid border_width=None, # 框架元素的线条宽度 element_justification="left", # 框架内元素的对齐方式 # 有效值 left,right,center vertical_alignment=None, # 垂直对齐方式 # top bottom center # 支持首字母简写 )

import PySimpleGUI as sg # 创建框架1的布局 f_layout1 = [ [sg.Text('请输入学生信息:')], [sg.Text('姓名'), sg.InputText(size=(34, 1))], [sg.Text('年级'), sg.InputText(size=(34, 1))], [sg.Button('添加', size=(10, 1)), sg.Button('查找', size=(10, 1)), sg.Button('删除', size=(10, 1))]] # 创建框架2的布局 f_layout2 = [ [sg.Text('2022年度统计表')], [sg.Listbox([], size=(34, 8))] ] # 创建窗口布局,在第二行里创建了两个框架,第二个框架的可视属性为假,先不显示 layout = [[sg.Button('切换显示')], [sg.Frame(title='信息录入', layout=f_layout1, key='-FRAME1-'), sg.Frame(title='学生信息汇总', layout=f_layout2, visible=False, key='-FRAME2-')]] window = sg.Window('框架演示', layout) # 定义用来设置框架属性的布尔变量 flag = False while True: event, values = window.read() # 点击切换显示按钮,让两个框架一个显示一个不显示 if event == '切换显示': window['-FRAME1-'].update(visible=flag) window['-FRAME2-'].update(visible=not flag) # 反转布尔变量的值 flag = not flag if event is None: break window.close()

运行效果:

3、标签选项卡Tab和TabGroup

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

格式:sg.TabGroup( [[sg.Tab('Tab1',tab1_layout,),sg.Tab('Tab2',tab2_layout)]])

TabGroup( layout, # 标签组内的tab布局,注意sg.Tab()要写在第一行。 tab_location=None, # 标签标题所处的位置 # 有效值有12个,分别为left, right, top, bottom, lefttop, leftbottom, # righttop, rightbottom, bottomleft, bottomright, topleft, topright title_color=None, # 标题文本颜色(未选中时) tab_background_color=None, # 所有标签背景颜色(未选中时) selected_title_color=None, # 选中时标题文本颜色 selected_background_color=None, # 选中时标签背景颜色 background_color=None, # 标签标题所在空白区域的背景颜色 border_width=None, # 边界线宽度设定 )

Tab( title, # str,标签上显示的文本 layout, # 标签内包含的布局 border_width=None, # 边界线宽度设定 element_justification="left", # 容器内元素的对齐方式 # 有效值 left,right,center )

import PySimpleGUI as sg # 创建标签1的布局 tab1 = [ [sg.Text('请输入学生信息:')], [sg.Text('姓名'), sg.InputText(size=(34, 1))], [sg.Text('年级'), sg.InputText(size=(34, 1))], [sg.Button('添加', size=(10, 1)), sg.Button('查找', size=(10, 1)), sg.Button('删除', size=(10, 1))]] # 创建标签2的布局 tab2 = [ [sg.Text('2022年度统计表')], [sg.Listbox([], size=(34, 8))]] # 创建窗口布局,最外层是TabGroup,内层包含两个Tab layout = [[sg.TabGroup([[sg.Tab(title='录入信息', layout=tab1), sg.Tab(title='信息汇总', layout=tab2)]], selected_title_color='red')]] window = sg.Window('框架演示', layout) while True: event, values = window.read() if event is None: break window.close()

运行效果:


五、预设按钮介绍

1、颜色选择器ColorChooserButton

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

格式:sg.ColorChooserButton()

ColorChooserButton( button_text, # 按钮元素要显示的文本 target=key, # 显示颜色码的目标元素的key )

import PySimpleGUI as sg # 定义布局,颜色选择器的目标容器是文本输入框key='-IN-' layout = [[sg.InputText(key='-IN-', enable_events=True)], [sg.ColorChooserButton('选择颜色', target='-IN-')]] window = sg.Window('颜色选择', layout) while True: event, value = window.read() # 文本输入框在接收了颜色值后触发事件,用选择的颜色值更新文本颜色 if event == '-IN-': window['-IN-'].update(text_color=value['-IN-']) if event is None: break window.close()

运行效果:

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

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

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

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

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

FileBrowse( button_text="Browse", # 按钮元素上要显示的文本 target=key, # 显示路径的目标元素的key file_types=(('ALL Files', '*.*'),), # 只显示指定的文件类型 '*.pdf' # 只显示指定的文件名称 'text.*' initial_folder=None, # 默认路径设定 )

3、日历选择器CalendarButton

格式:sg.CalendarButton(参数)

CalendarButton( button_text, # 按钮上显示的文本 target=(key), # 选择的日期要显示的位置 close_when_date_chosen=True, # 选择日期后 日历界面关闭 default_date_m_d_y=(None, None, None), # 默认年月日设定 locale=None, # 区域设置 format="%Y-%m-%d %H:%M:%S", # 显示格式 begin_at_sunday_plus=0, # 星期日开始位置,0表示第一列从星期日开始 month_names=None, # 月份名,列表 day_abbreviations=None, # 星期名,列表 title="Choose Date", # 标题文本 no_titlebar=True, # 没有标题板块 location=(None, None), # 日历显示的位置 )


六、弹窗介绍

1、弹窗Popup

格式:sg.Popup(参数) 或 sg.popup(参数)

Popup( args=*<1 or N object>, # 可变参数 title=None, # 弹窗标题,如果未设定,则默认显示可变参数的第一个文本作为标题。 button_color=None, # (文本颜色,背景颜色) background_color=None, # 弹窗的背景颜色 text_color=None, # 弹窗上面的文本颜色 auto_close=False, # 如果设定为True,弹窗会自动关闭界面 auto_close_duration=None, # 自动关闭窗口之前界面持续的时间(以秒为单位) custom_text=(None, None), # 自定义按钮上要显示的文本。可以设定一个或者两个 non_blocking=False, # 非阻塞设定。如果为True,立即执行下一步。不需要等待用户的输入。 font=None, # 字体大小,名称设定 no_titlebar=False, # 不显示标题栏。 grab_anywhere=False, # 如果为True,拖动界面进行移动。 keep_on_top=False, # 如果为True,保持界面在屏幕的最前方 location=(None, None), # 界面出现的位置 any_key_closes=False, # 如果为True,敲打任意键盘就会关闭界面. # 如果为False,只用X窗口关闭按钮,用户选择,以及回车键才会关闭窗口。 image=None, # 显示图片(支持base64) modal=True # 模态窗口设定。 # 除非关闭此窗口否则其他界面不能进行操作。 )

2、弹窗PopupGetText

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

格式:sg.PopupGetText(参数) 或者 sg.popup_get_text(参数)

PopupGetText( message, # 显示的文本 title=None, # 标题设定 default_text="", # 输入框内默认文本设定 password_char="", # 密码字符 一般设定为* size=(None, None), # 单行输入框的宽度和行高设定 button_color=None, # 按钮元素的(文本颜色,背景颜色)设定 background_color=None, # 界面背景颜色设定 text_color=None, # 文本颜色设定 font=None, # 字体名称和大小设定 no_titlebar=False, # 无标题栏设定 grab_anywhere=False, # 移动窗口设定 keep_on_top=False, # 保持该弹窗在界面的最前方 location=(None, None), # 窗口出现的位置设定 image=None, # 图片上传 modal=True #模态界面设定。如果为True,其他界面无法操作。 )

3、弹窗PopupGetFile

显示带有文本输入字段和浏览(browse)按钮的弹出窗口,以便用户可以选择文件。

格式:sg.PopupGetFile() 或 sg.popup_get_file()

PopupGetFile( message, # 文本设定 title=None, # 窗口标题设定 default_path="", # 默认文件路径 save_as=False, # 如果设定为True,打开按钮变成的另存为按钮,显示Save As... multiple_files=False, # 如果为True,可以多选。 file_types=(('ALL Files', '*.*'),), # 设定可选文件类型。默认所有。 no_window=False, # 直接打开文件资源管理器,不显示弹窗界面。 size=(None, None), # 单行输入框的宽度行高的设定 button_color=None, # 按钮元素(文本颜色,背景颜色)的设定 background_color=None, # 整个界面的背景颜色的设定 text_color=None, # 文本字体颜色的设定 font=None, # 字体名称,大小设定 no_titlebar=False, # 如果为True,不显示标题栏。 grab_anywhere=False, # 如果为True,可以拖拽界面 keep_on_top=False, # 如果为True,窗口保持在界面的最前方。 location=(None, None), # 界面运行出现的初始位置) initial_folder=None, # 打开咨询管理器时默认的文件夹 image=None, # 图片上传 modal=True # 模态窗口)

4、其它弹窗


七、菜单栏介绍

格式:sg.Menu(参数)

Menu( menu_definition, # 菜单栏定义 tearoff=False, # 独立菜单设定 font=None, # 字体名称大小设定 pad=None, # 周围元素间隔设定 key=None, # 唯一标识符设定 )

menu_def = [['&File', ['!&New File', '&Open File::openkey', '---', 'Open Fol&der', 'E&xit']], ['!&Edit', ['!&Paste', ['Cut', 'Repeat', ], 'Undo'], ], ['&Find', ['Find...', 'Replace']], ['&Tools', ['Command &1', 'Command &2', 'Command &3', 'Command &4']], ['&Help', '&About...'], ]

'---' :菜单栏分割线
& :快捷键标注 Alt key(避免重复)
! :菜单栏禁用设定
:: :菜单key设定。作为事件的一部分,当有重名菜单项时可以设置。

import PySimpleGUI as sg # 菜单设计 menu_def = [['&File', ['!&New File', '&Open File::openkey', '---', 'Open Fol&der', 'E&xit']], ['&Edit', ['&Paste', ['Cut', 'Repeat', ], 'Undo'], ], ['F&ind', ['Find...', 'Replace']], ['!&Tools', ['Command &1', 'Command &2', 'Command &3', 'Command &4']], ['&Help', '&About...'], ] layout = [ [sg.Menu(menu_def, key='-MENU-')], [sg.Multiline(key='-ML-', size=(60, 10))] ] window = sg.Window('菜单演示', layout, keep_on_top=True) while True: event, values = window.read() print(event) if event is None: break window.close()

运行效果:


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

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved