1、用户界面简介
用户界面分为命令行用户界面和图形用户界面,是人机交互的重要手段。
很显然,图形用户界面要比命令行用户界面更直观、操作更便捷,所以开发完整的Python项目必须要设计一个功能完备并且漂亮的图形界面。
2、常用图形用户界面库简介
Python中常用的图形用户界面库有Thinker、PyQt、PySide2、WxPython和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