天天看点

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

作者:知者不惑FYK
Python学习笔记 | 使用PySimpleGUI模块开发图形用户界面(完整)

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

1、用户界面简介

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

  • 命令行用户界面:Command line User Interface(简称CUI),一般不支持鼠标,需要通过键盘输入指令,例如Windows系统的终端命令窗口、Python的运行和控制台窗口等。
  • 图形用户界面:Graphical User Interface(简称GUI), 允许用户使用鼠标和键盘点击选择图标和菜单项,来完成启动程序、执行命令和操作文件等日常事务,例如Windows系统界面。

很显然,图形用户界面要比命令行用户界面更直观、操作更便捷,所以开发完整的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使用了比较宽松的公共许可证——LGPL 3。

二、PySimpleGUI模块基本应用

1、基本步骤

  • 导入库:import PySimpleGUI as sg,简写sg是约定成俗的写法
  • 定义布局layout:layout是一个二维列表,外层列表里面包含多个内层列表,每个内层列表就是图形用户界面上的一行,包含这一行的所有控件定义
  • 创建窗口对象:使用PySimpleGUI的Window类创建一个窗口对象,参数包括窗口标题、布局layout等
  • 事件循环:利用while True进行无限循环,避免窗口一闪即关,同时反复读取窗口对象的事件和数据,然后进行判断处理
  • 关闭窗口对象:使用close方法变比窗口对象,释放资源

模版代码如下:

# 导入库
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,窗口对象同样。

运行结果:

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

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()           

运行效果如下图:

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

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()           

运行效果如下图:

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

【技巧】如果设置主题语句的参数为空字符串,即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()           

运行效果:

Python学习笔记 | 使用PySimpleGUI模块开发图形用户界面(完整)
  • 纵向批量创建按钮组件
layout = [[sg.Button(i)] for i in '1234567890']           

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

Python学习笔记 | 使用PySimpleGUI模块开发图形用户界面(完整)
  • 仿计算器样式创建按钮组件
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()
           

运行效果:

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

三、核心组件介绍

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

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方法

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方法
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方法
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方法
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方法
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'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'

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()           

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

运行效果如下:

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

在上面的实例中,两个按钮都使用了图片,其中确定按钮采用的是调用磁盘文件的形式,而取消按钮采用了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方法
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方法
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方法
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方法
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方法
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()           

运行效果:

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

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。这个组件很繁琐,写代码时一定要组织好组件与组件、层与层的结构。

  • TabGroup的语句格式

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

  • TabGroup的特殊属性
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的特殊属性
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()           

运行效果:

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

五、预设按钮介绍

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、其它弹窗

  • PopupGetFolder:带有文件夹选择按钮
  • PopupAnnoying:没有标题栏,随意移动
  • PopupAutoClose:自动关闭
  • PopupCancel:带有Cancel按钮
  • PopupOKCancel:带有OK和Cancel按钮
  • PopupError:带有Error按钮
  • PopupNoButtons:无按钮
  • PopupNoWait:直接返回

七、菜单栏介绍

格式:sg.Menu(参数)

  • 详细参数
Menu(
   menu_definition,
   			# 菜单栏定义
    tearoff=False,
    			# 独立菜单设定
    font=None,
    			# 字体名称大小设定
    pad=None,
    			# 周围元素间隔设定
    key=None,
    			# 唯一标识符设定
      )           
  • menu_definition示例
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模块介绍到此全部完毕,篇幅太长了,但是为了知识点的连续性,还是都放在了一个篇幅里。如有不到之处,敬请教诲。