PySimpleGui_Note

发布时间 2023-12-29 15:42:13作者: 徐凯K

PySimpleGui_Note

1.模块安装与导入

# 安装命令
pip install PySimpleGui
# 模块导入
import PySimpleGui	# 方式一
import PySimpleGui as Sg		# 方式二,方便后续引用

2.创建基本页面

import PySimpleGui as Sg

# 控制页面布局
layout = [
    [Sg.Text("第一行文字")],
    [Sg.Text("姓名:"),Sg.InputText("请输入姓名")],
    [Sg.Button("确定"),Sg.Button("取消")],
]

# 定义程序的布局,返回一个windows类:Windows = Sg.Windows("程序的名称",layout=layout)

# 读取窗口,返回两个结果:一个是事件,一个是值: Windows.read()

# 启动界面和关闭界面
windows = Sg.windows("基本界面",layout=layout)
while 1:
    event,value = windows.read()
    if event == None:		# event == None:用于判断是否点击右上角的x进行关闭的操作
        windows.close()		# 关闭窗口
        break
        

3.窗口关闭事件

​ 窗口关闭事件,即是通过点击右上角的X进行关闭

# 窗口关闭事件
if event == None:	# 此时表示鼠标点击了右上角的X
    windows.close()		# 关闭窗口
if event == Sg.Win_CLOSED:
    windows.close()	
# 注意:必须定义窗口关闭事件,否则会消耗100%的CPU

4.按钮点击事件

# Sg.PopUp("弹窗提示信息")		# 小弹窗

# 针对一个按钮对应的事件
if event == "确定":
    # 点击按钮【确定】时执行的操作
    Sg.PopUp("弹窗:点击了【确定】")

# 针对多个按钮执行的相应的事件
if event in ("确定","取消"):
    Sg.Popup(f"弹窗:点击了【{event}】")
    
# 针对按钮的开头文字 
if event.startswith("确"):
    Sg.Popup(f"弹窗:点击了【{event}】")

# 针对按钮的结尾文字
if event.endswith("消"):
    Sg.Popup(f"弹窗:点击了【{event}】")
    
# 特殊:像【文本元素】、【输入框】、【下拉菜单】等事件属性默认是关闭的,如果需要,可以手动设置他们的事件属性,enable_event=True为真时,他们也将具有事件属性
layout = [
    [Sg.Text("第一行文字",enable="标题")],
    [Sg.Text("姓名:"),Sg.InputText("请输入姓名")],
    [Sg.Button("确定"),Sg.Button("取消")],
]
if event == "标题":
    Sg.Popup("点击了【标题】")

5.获取输入窗口的值

1. 通过索引的方式进行引用
1. 通过字典的形式获取输入框的值
# 1.通过索引获取对应的值:windows.read()获取event和value,其中value是:{0: '', 1: ''},分别代表第一个输入框输入"",第二个输入框输入"",通过索引的方式可以获取到对应输入框的值

# 2.通过字典的形式获取输入框的值
    layout = [
        [sg.Text("标 题",enable_events=True)],
        [sg.Text("姓名:"),sg.Input(key="username")],
        [sg.Text("性别:"),sg.InputText(key="sex")],
        # [sg.Text("文本")],
        [sg.Button("确定"),sg.Button("取消")],
    ]
    window = sg.Window("程序窗口",layout=layout) 
    while 1:
        event,value = window.read()
        if event == "确定":
            sg.Popup(f"单击事件:{event},输入的用户名:{value.get('username')},输入的性别:{value.get('sex')}")
        
# 关于value和event以及事件触发enable_events
# value 记录了所有元素的值,如果对应元素有事件发生,那对应元素的key的值就会被记录,即如果元素的enable_events设置为真,那么当操作对应元素时,就会返回对应元素的值到values的列表中

6.主题

# 整体布局的主题设置:
Sg.theme("DarkGreen5")	

# 内部允许设置的颜色:
['Black', 'BlueMono', 'BluePurple', 'BrightColors', 'BrownBlue', 'Dark', 'Dark2', 'DarkAmber', 'DarkBlack', 'DarkBlack1', 'DarkBlue',
'DarkBlue1', 'DarkBlue10', 'DarkBlue11', 'DarkBlue12', 'DarkBlue13', 'DarkBlue14', 'DarkBlue15', 'DarkBlue16', 'DarkBlue17',
'DarkBlue2', 'DarkBlue3', 'DarkBlue4', 'DarkBlue5', 'DarkBlue6', 'DarkBlue7', 'DarkBlue8', 'DarkBlue9', 'DarkBrown', 'DarkBrown1',
'DarkBrown2', 'DarkBrown3', 'DarkBrown4', 'DarkBrown5', 'DarkBrown6', 'DarkBrown7', 'DarkGreen', 'DarkGreen1', 'DarkGreen2',
'DarkGreen3', 'DarkGreen4', 'DarkGreen5', 'DarkGreen6', 'DarkGreen7', 'DarkGrey', 'DarkGrey1', 'DarkGrey10', 'DarkGrey11', 
'DarkGrey12', 'DarkGrey13', 'DarkGrey14', 'DarkGrey15', 'DarkGrey2', 'DarkGrey3', 'DarkGrey4', 'DarkGrey5', 'DarkGrey6',
'DarkGrey7', 'DarkGrey8', 'DarkGrey9', 'DarkPurple', 'DarkPurple1', 'DarkPurple2', 'DarkPurple3', 'DarkPurple4', 
'DarkPurple5', 'DarkPurple6', 'DarkPurple7', 'DarkRed', 'DarkRed1', 'DarkRed2', 'DarkTanBlue', 'DarkTeal', 'DarkTeal1', 
'DarkTeal10', 'DarkTeal11', 'DarkTeal12', 'DarkTeal2', 'DarkTeal3', 'DarkTeal4', 'DarkTeal5', 'DarkTeal6', 'DarkTeal7', 
'DarkTeal8', 'DarkTeal9', 'Default', 'Default1', 'DefaultNoMoreNagging', 'GrayGrayGray', 'Green', 'GreenMono', 'GreenTan',
'HotDogStand', 'Kayak', 'LightBlue', 'LightBlue1', 'LightBlue2', 'LightBlue3', 'LightBlue4', 'LightBlue5', 'LightBlue6', 
'LightBlue7', 'LightBrown', 'LightBrown1', 'LightBrown10', 'LightBrown11', 'LightBrown12', 'LightBrown13', 'LightBrown2', 
'LightBrown3', 'LightBrown4', 'LightBrown5', 'LightBrown6', 'LightBrown7', 'LightBrown8', 'LightBrown9', 'LightGray1',
'LightGreen', 'LightGreen1', 'LightGreen10', 'LightGreen2', 'LightGreen3', 'LightGreen4', 'LightGreen5', 'LightGreen6',
'LightGreen7', 'LightGreen8', 'LightGreen9', 'LightGrey', 'LightGrey1', 'LightGrey2', 'LightGrey3', 'LightGrey4', 'LightGrey5', 
'LightGrey6', 'LightPurple', 'LightTeal', 'LightYellow', 'Material1', 'Material2', 'NeutralBlue', 'Purple', 'Python',
'PythonPlus', 'Reddit', 'Reds', 'SandyBeach', 'SystemDefault', 'SystemDefault1', 'SystemDefaultForReal', 'Tan', 'TanBlue', 'TealMono', 'Topanga']

# 如果设置的颜色不在上述颜色中,会提示以下警告信息并随机生成一种颜色
eg:
   	Sg.theme("Pink")	# 此时生成的是随机颜色!!!
** Warning - Pink Theme is not a valid theme. Change your theme call. **

# 如果设置为空,也会随机生成颜色
Sg.theme("")

7.控件主题颜色设置

def change_theme_control():
    layout = [
        [sg.Text("标题")],
        [sg.Text("姓名:"), sg.Input(key="username")],
        [sg.Text("性别:"), sg.InputText(key="sex")],
        [sg.Button("确定"), sg.Button("取消")],
    ]

    # 设置主题背景色
    # sg.theme_background_color("#A066D3")    # Maroon   #DA70D6

    # 设置 边框 宽度
    # sg.theme_border_width(8)

    # 设置 按钮  颜色
    # sg.theme_button_color('Pink')   # 没效果

    # 设置 元素背景颜色
    # sg.theme_element_background_color('Dark')       # 没效果

    # 设置 主题元素文本颜色
    # sg.theme_text_color('LightBlue3')       # 没效果

    # 设置 输入框背景颜色
    # sg.theme_input_background_color('LightBlue3')   # 没效果

    # 设置  输入框文本颜色(只能设置输入框光标的颜色)
    sg.theme_input_text_color('Red')

    # 设置  进度_栏_边框的颜色
    sg.theme_progress_bar_border_width()  # 主题_进度_栏_边框_颜色
    # # 主题_进度_栏_颜色
    sg.theme_progress_bar_color()

    sg.theme_slider_border_width()  # 主题_滑块_边框_颜色
    sg.theme_slider_color()  # 主题_滑块_颜色

    sg.theme_text_color("Red")  # 主题_文本_颜色
    sg.theme_text_element_background_color("Red")  # 主题_文本_元素_背景_颜色

    windows = sg.Window("部分控件设置",layout)
    while 1:
        event,values = windows.read()
        if event == None:
            windows.close()
            break

8.批量创建

# 利用for循环进行多种元素创建:以列表的形式就是在同一行
layout[
    [sg.In()  for i in "ABCD"]
]

# 以key的形式就是分行创建
layout[
    [[PySimpleGUI.In()] for i in ["12","34","56"]]
]

# eg:
def create_with_for():
    # 创建在同一行
    layout = [
        [sg.In() for q in "ABCD"]
    ]
    # 创建多行:
    layout = [
        [[sg.In()] for q in ["11",'22','33']]
    ]

    windows = sg.Window("批量创建",layout=layout)
    while 1:
        event,values = windows.read()
        if event == None:
            windows.close()
            break

9.自定义布局

# 页面布局时,可以用,进行多个元素的拼接,也可以使用+进行拼接,但是需要加上[]

def create_with_add():
    layout = [
        [sg.Text("标题")],
        [sg.Text("姓名:")]+[sg.Input(key="username")],	# 实现效果和使用,隔开一样
        [sg.Text("性别:")]+[sg.InputText(key="sex")],
        [sg.Button("确定"), sg.Button("取消")],
    ]
    windows = sg.Window("批量创建",layout=layout)
    while 1:
        event,values = windows.read()
        if event == None:
            windows.close()
            break

10.文本元素的参数

    [PySimpleGUI.T(text,
                   key="-Text-",                # 元素唯一标识符,用于元素的定位
                   size=(None, None),           # 元素宽度,行高(int, int)
                   font=("宋体", 20),            # 设定文字字体,大小,font="宋体",font=("宋体", int) or font["宋体", int]
                   auto_size_text=True,         # 当设定值为True时,窗口自动适应文本大小
                   enable_events=False,         # bool: 事件属性,设定为True时,点击文本发生事件
                   relief="solid",              # 浮雕设计"raised", "sunken", "flat", "ridge", "solid", "groove"
                   border_width=20,             # 当设定relief时,用来设定对应效果的边界宽度
                   text_color=None,             # 文本颜色
                   background_color=None,       # 文本背景颜色
                   justification=None,          # 对齐方式: "left", "right", "center"
                   pad=None,                    # 元素间隔设定  记住左右上下((int, int), (int, int))当左右或上下值一样时(int, int)
                   right_click_menu=None,       # 右击可以调出菜单 list[list[Union[List[str],str]]]
                   grab=None,                   # 如果为真,点击此元素可以移动拖拽窗口
                   tooltip=None,                # str: 悬浮文本,当光标置于该元素上方,会显示设定的文本
                   visible=True)]               # bool: 元素可见状态
]

# EG:
def create_with_add():
    layout = [
        [sg.Text("标题")],
        [sg.Text("姓名:",text_color="Pink",)]+[sg.Input(key="username",text_color="Pink")],
        [sg.Text("性别:",background_color="Purple")]+[sg.InputText(key="sex",background_color="Green")],
        [sg.Button("确定"), sg.Button("取消")],
    ]
    windows = sg.Window("批量创建",layout=layout)
    while 1:
        event,values = windows.read()
        if event == None:
            windows.close()
            break

11.文本元素的更新

'''
语法:
windows[key].update()
eg:
windows[key].update(
        value=None,             # str更新文本(只更新文本可以智驾用字符串)
        background_color=None,  # 更新文本背景颜色
        text_color=None,        # 更新文本颜色
        font=None,              # 更新字体的名称或者大小                   
        visible=None            # 更新元素的可见状态
)
'''

def create_with_add():
    layout = [
        [sg.Text("标题")],
        [sg.Text("姓名:",text_color="Pink",key="User")]+[sg.Input(key="username",text_color="Pink")],
        [sg.Text("性别:",background_color="Purple",key="Pwd")]+[sg.InputText(key="sex",background_color="Green")],
        [sg.Button("确定"), sg.Button("取消"),sg.Button("变色")],

    ]
    windows = sg.Window("批量创建",layout=layout)

    while 1:
        event,values = windows.read()

        if event == None:
            windows.close()
            break
        elif event == "变色":
            windows['User'].Update(
                background_color="Pink",
                text_color="Black"
            )
            windows['Pwd'].update(
                background_color="Pink",
                text_color="Black"
            )

12.输入框的参数

[PySimpleGUI.In(text,
                key="-Text-",                # 元素唯一标识符,用于元素的定位
                size=(None, None),           # 元素宽度,行高(int, int)
                text_color=None,             # 输入框里的文本颜色
                background_color=None,       # 输入框的颜色
                justification=None,          # 对齐方式: "left", "right", "center"
                disabled=None,               # 元素禁用,如果为True则禁用,无法输入任何值
                disable_readonly_background_color=None,  # 元素禁用时的背景颜色设定
                disable_readonly_text_color=None,        # 元素禁用时的文本颜色设定
                password_char=""             # 密码字符,一般设置为*
                font=("宋体", 20),            # 设定文字字体,大小,font="宋体",font=("宋体", int) or font["宋体", int]
                border_width=20,             # 输入框边界线宽度设定
                enable_events=False,         # bool: 输入框的事件属性,设定为True时,输入值会发生事件
                do_not_clear=True,           # bool: 输入框内容不被清除,如果为False,一旦发生事件,该输入框内的值会被清楚        
                focus=False,                # 设定焦点,如果为True,则光标显示在此输入框
                pad=None,                    # 元素间隔设定  记住左右上下((int, int), (int, int))当左右或上下值一样时(int, int)
                right_click_menu=None,       # 右击可以调出菜单 list[list[Union[List[str],str]]]
                grab=None,                   # 如果为真,点击此元素可以移动拖拽窗口
                tooltip=None,                # str: 悬浮文本,当光标置于该元素上方,会显示设定的文本
                visible=True)]               # bool: 元素可见状态
]

13.单行输入框更新方法

# update()方法更新元素
# windows[key].Update()

def change_language():
    layout = [
        [sg.Text("标题",key="title")],
        [sg.Text("姓名:",text_color="Pink",key="User"),sg.Input(key="username_input",text_color="Pink")],
        [sg.Text("性别:",text_color="Pink",key="Sex"),sg.InputText(key="sex_input")],
        [sg.Button("确定",key='sure',size=(8,1)), sg.Button("取消",key='cancel',size=(8,1)),sg.Button("英文",size=(8,1)),sg.Button("中文",size=(8,1))],
    ]
    windows = sg.Window("修改语言",layout=layout)

    while 1:
        event,values = windows.read()
        print(event,"***")
        if event == None:
            windows.close()
            break
        elif event == "英文":
            print(event)
            windows['title'].update("Title")
            windows['User'].Update("User:")
            windows['Sex'].update("Sex:")
            windows['sure'].update("Sure")
            windows['cancel'].update("Cancel")
            # windows['英文'].update("中文")
        elif event == "中文":
            windows['title'].update("标题")
            windows['User'].Update("姓名:")
            windows['Sex'].update("性别:")
            windows['sure'].update("确定")
            windows['cancel'].update("取消")
            # windows['中文'].update("英文")
        elif event in ("确定","sure"):
            windows['username_input'].update(
                # background_color='Pink',
                value="已输入用户名",
                disabled=None,
                select=None,
                visible=None,
                text_color="red",
                move_cursor_to="end",   # 光标移动到最后

            )
            print(event)
        elif event == "取消":
            print(event)
            
# setFocus的方法,设置元素焦点
# windows[key].setFocus()
# windows[key].set_focus()

# SetTooltip的方法,更新元素悬浮提示
# windows[ky].SetTooltip()
# windows[key].set_ftooltip()


def test_focus():
    layout = [
        [sg.Text("标题",key="title")],
        [sg.Text("姓名:",text_color="Pink",key="User"),sg.Input(key="username_input",text_color="Pink")],
        [sg.Text("性别:",text_color="Pink",key="Sex"),sg.InputText(key="sex_input")],
        [sg.Button("确定",key='sure',size=(8,1)), sg.Button("取消",key='cancel',size=(8,1)),sg.Button("英文",size=(8,1)),sg.Button("中文",size=(8,1))],
    ]
    windows = sg.Window("修改语言",layout=layout)

    while 1:
        event,values = windows.read()
        print(event,"***")

        if event == None:
            windows.close()
            break
        elif event in ("确定","sure"):
            # windows['User'].set_tooltip("哈哈哈哈哈")
            windows["username_input"].SetTooltip("哈哈哈")


14.按钮元素

# 按钮元素的基本参数
pg.Button(button_text="",
               Key=None,
               tooltip=None,            # 悬浮文本
               disabled=False,          # 元素禁用设定
               image_filename=None,     # 图片路径,按钮图片表示,和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
               border_width=None,       # 按钮边界线设定
               size=(None, None),
               auto_size=None,          # 按键上文本大小自动调节
               button_color=("", ""),   # 按键的颜色,前面是字体,后面是背景
               disabled_button_color=None,  # 按键禁用时显示的按钮颜色
               font=None,
               bind_return_key=False,       # 绑定回车键,如果设定为True,回车键会使此元素被点击
               focus=False,
               pad=None)
                ]

# 按钮元素的更新方法:update
window[key].update()
window[key].Update()

# 获取base64格式文件的方法
import base64
f = open(r"文件路径", "rb")
res = f.read()
s = base64.b64encode(res)
f.close()


15.列表元素

# 列表元素使用方式
PySimpleGUI.Listbox(list)
PySimpleGUI.LB(list)
# 列表元素的参数
[pg.Listbox(list_A, size=(80, 40),
            default_values=None,                # 打开时默认选中的值或者列表
            key=None,
            select_mode=None,                   # 鼠标选择模式,有效值有4中:
            # single, 单选,更换时点击选择
            # multiple, 可以多选,逐一点击选择
            # browse, 单选,鼠标按住也可以更换选择
            # extended, 可以多选,鼠标按住也可以扩展选择
            enable_events=False,                # 列表元素的事件属性,如果为True,点击时会返回key
            bind_return_key=True,               # 绑定回车键,如果为True回车键按下时,相当于此元素被点击
            disabled=False,
            auto_size_text=True,
            font=None,
            no_scrollbar=False,                 # 如果为True,则没有滚动条
            background_color="",
            text_color="",
            pad=None,
            tooltip=None,                       # 悬浮文本
            right_click_menu=None,              # 右击调出菜单
            visible=True
           )]
# 列表元素更新方法
window[key].update()

window[key].Update()
# 列表元素可更新的元素
wd["None"].update(
    values=None,                # 元祖或者列表[1,2,]或(1,2,)
    disabled=None,              # 更新元素后是否被禁用
    set_to_index=None,          # 高亮显示设定的索引对应的列表值
    scroll_to_index=None,       # 将设定的索引跳到要显示的第一行
    select_mode=None,
    visible=None
)
# 示例
def test_list():
    list1 = [i for i in range(1,11)]
    layout = [
        [sg.Text("标题",key="title")],
        [sg.Text("姓名:",text_color="Pink",key="User"),sg.Input(key="username_input",text_color="Pink")],
        [sg.Text("性别:",text_color="Pink",key="Sex"),sg.InputText(key="sex_input")],
        [sg.Button("确定",key='sure',size=(8,1)), sg.Button("取消",key='cancel',size=(8,1)),sg.Button("英文",size=(8,1)),sg.Button("中文",size=(8,1))],
        [sg.Listbox(list1,key='select1',select_mode='multiple',no_scrollbar=True)],
        [sg.Button("单选",key="single"),sg.Button("多选",key="multiple")],

    ]
    windows = sg.Window("修改语言",layout=layout)
    while 1:
        event,value = windows.read()
        if event == None:
            windows.close()
            break
        elif event in ("确定","sure"):
            print(value)
        elif event == "单选":
            windows['select1'].update(
                select_mode="single",	# 没生效,没有自动更新
                values=None,			# 没生效,没有自动更新
            )
        elif event == "多选":
            windows['select1'].update(
                select_mode="multiple",		# 没生效,没有自动更新
                value=None,					# 没生效,没有自动更新
            )
            

16.下拉菜单

# 下拉菜单使用方法
PySimpleGUI.Comno()
PySimpleGUI.InputComno()
PySimpleGUI.DropDown()
PySimpleGUI.Drop()
'''
  此方法与上述列表元素的最大区别在于,该方法可以输入,但不能多选,而Listbox取得的值是存放在列表里面,但是Combo取得的值是对象本身。
'''

# 下拉菜单的参数
[pg.Drop(list_A,
         size=(1, 2),
         auto_size_text=True,
         background_color="",
         text_color="",
         enable_events=False,
         disabled=False,
         pad=None,
         tooltip=None,
         readonly=False,        # 元素只读属性,只能选择不能输入内容
         font=None,
         visible=True
        )]
]

# 下拉菜单的更新
window[key].update()
window[key].Update()

# 下拉菜单可更新的参数
wd[A].update(value=None,            # 更新默认选中的选项
             values=None,           # 更新显示的所有下拉菜单文本
             set_to_index=None,     # 高亮显示设定的索引的文本
             disabled=None,         # 更新元素的禁用状态
             readonly=None,         # 更新元素的只读状态
             font=None,
             visible=None
            )

# 示例
def test_comno():
    list1 = [i for i in range(1,11)]
    layout = [
        [sg.Text("标题",key="title")],
        [sg.Text("姓名:",text_color="Pink",key="User"),sg.Input(key="username_input",text_color="Pink")],
        [sg.Text("性别:",text_color="Pink",key="Sex"),sg.InputText(key="sex_input")],
        [sg.Button("确定",key='sure',size=(8,1)), sg.Button("取消",key='cancel',size=(8,1)),sg.Button("英文",size=(8,1)),sg.Button("中文",size=(8,1))],
        [sg.Drop(list1,text_color="Red",key="drop",size=(100,30))],
        [sg.Button("更改下拉框可读属性")]
    ]
    windows = sg.Window("修改语言",layout=layout)

    while 1:
        event,value = windows.read()
        if event == None:
            windows.close()
            break
        elif event == "更改下拉框可读属性":
            print(value)
            windows['drop'].update(
                readonly=True,
            )

17.选择菜单和旋转按钮

# 选择菜单使用方法
PySimpleGUI.OptionMenu()
# 此元素和设置了只读属性的ComboBox很像,只是没有font、enable_events事件属性

# 选择菜单的参数
[pg.OptionMenu(list_A,
               default_value=None,          # 默认文本
               key=None,                    # 唯一标识符
               size=(None, None),           # 元素的宽度和行高
               disabled=False,
               auto_size_text=False,
               background_color="",
               text_color="",
               pad=None,
               tooltip=None,
               visible=True
              )]
]

# 选择菜单的更新
wd[key].update()

# 选择菜单可更新的参数
wd["None"].update(value=None,			# 结果设置为某一个固定值
                  values=None,			# 修改可选的所有参数
                  disabled=None,		# 是否可修改
                  visible=None)			# 是否展示

# 示例
def test_optionmenu():
    list1 = [i for i in range(1,11)]
    layout = [
        [sg.Text("标题",key="title")],
        [sg.Text("姓名:",text_color="Pink",key="User"),sg.Input(key="username_input",text_color="Pink")],
        [sg.Text("性别:",text_color="Pink",key="Sex"),sg.InputText(key="sex_input")],
        [sg.Button("确定",key='sure',size=(8,1)), sg.Button("取消",key='cancel',size=(8,1)),sg.Button("英文",size=(8,1)),sg.Button("中文",size=(8,1))],
        [sg.OptionMenu(list1,text_color="Red",key="drop",size=(100,30))],
        [sg.Button("更改选择菜单可读属性")]
    ]
    windows = sg.Window("修改语言",layout=layout)

    while 1:
        event,value = windows.read()
        if event == None:
            windows.close()
            break
        elif event == "更改选择菜单可读属性":
            print(value)
            windows['drop'].update(
                disabled=True,	
            )

18.单选框元素

# 单选框元素使用方法
PySimpleGUI.Radio("", group_id)
PySimpleGUI.R("", group_id)
group_id的意思就是,单选框元素只能有一个选择,选择这个,另一个就非选择状态

# 单选框元素更新
---window[key].update()

--window[key].ResetGroup() / window[key].reset_group()	# reset_group:重置选择为空
# 同一个group_id的单选框,可以使用任意一个key对整个group进行重置操作

# 单选框属性,与其他基本一致,就多了一个group_id	!!!!!!
# 单选框元素可更新的属性
wd["D"].update(value=None,              # 为True是,此单选框被选中,同组其他更新为未选中、
               text=None,               # str 更新显示在按钮旁边的文本
               background_color="",
               text_color="",
               disabled=None,
               visible=None
              )
# 获取返回值,返回值格式如下
value={'A': True, 'B': False, 'C': False, 'D': False}
# 示例
def test_radio():
    list1 = [["A",1],["B",2],["C",3],["D",4]]
    layout = [
        [sg.Text("选择题,请选择正确答案:")],
        [sg.Radio(i[1],group_id=1,key=i[0]) for i in list1],
        [sg.Button("确定"),sg.Button("重选")]
    ]
    windows = sg.Window("单选题",layout=layout)
    while 1:
        event,value = windows.read()
        if event == None:
            windows.close()
            break
        elif event == "重选":
            windows["A"].reset_group()  # 同一个group_id的单选框,可以使用任意一个key对整个group进行重置操作
        print(f"value={value}")

19.复选框元素

# 复选框方法
PySimpleGUI.Checkbox()
PySimpleGUI.CB()

# 复选框的更新方法
window[key].update()

# 复选框的属性
[pg.Checkbox(text="AA",          # 选框旁边的数字
             key="AA",           
             default=False,      # 是否默认选中
             size=(None, None),
             auto_size_text=True,
             font=None,          # (str,int)字体类型和大小
             background_color="",
             text_color="",
             enable_events=False,
             pad=(None, None),
             tooltip="",
             visible=True)]
]

# 复选框可更新的属性
wd["AA"].update(value=None,         # 更新选中状态,如果为True则选中,为False则清空
                text=None,
                background_color="",
                text_color="",
                disabled=None,
                visible=None
               )
# 返回的结果h值:
value={'A': True, 'B': True, 'C': False, 'D': False}
# 示例
def test_checkbox():
    list1 = [["A", 1], ["B", 2], ["C", 3], ["D", 4]]
    layout = [
        [sg.Text("复选框测试,多选题")],
        [sg.Checkbox(i[1],key=i[0],size=(10,3)) for i in list1], #text="AA",
        [sg.Button("确定"),sg.Button("重置")],
    ]
    windows = sg.Window("复选框",layout=layout)
    while 1:
        event,value = windows.read()
        if event == None:
            windows.close()
            break
        elif event == "确定":
            print(f"确定复选结果:{value}")
        elif event == "重置":
            for i in list1:
                windows[i[0]].update(
                    value = False
                )
        print(f"value={value}")

20.滑块元素

# 滑块元素语法
PySimpleGUI.Slider()

# 滑块元素更新语法
window[key].update()
window[key].Update()
    
# 滑块元素的属性
[pg.Slider(range=(None, None),       # 滑块的范围(最小值,最大值)
           key=None,                 # 元素的唯一标识符
           default_value=None,       # 滑块初始所处的位置
           tick_interval=None,       # 刻度值标记
           resolution=None,          # 滑块移动的最小单位
           orientation=None,         # 方向设定,水平("h"/"horizontal")或者垂直("v"/"vertical")
           disable_number_display=False, # 默认为false,如果为True,滑块旁的数字不显示
           border_width=None,        # 边界线宽度
           relief=None               # 浮雕设计,"raised"/"sunken"/"flat"/"ridge"/"solid/"groove"

          )]

# 滑块元素可更新的属性
wd["None"].update(value=None,
                  range=(None, None),
                  disabled=None,
                  visible=None
                 )
# 示例
def test_slide():
    layout = [
        [sg.Text("滑块测试")],
        [sg.Slider(key='slide1',orientation='horizontal')],
        [sg.Button("滑块重置")]
    ]
    windows = sg.Window("滑块测试",layout=layout)
    while 1:
        event,value = windows.read()
        if event == None:
            windows.close()
            break
        elif event == "滑块重置":
            windows["slide1"].update(
                range=(1,100),
            )
        print(value)

21.图片元素

# 图片元素语法
PySimpleGUI.Image(filename="图片路径")
图片路径仅支持GIF和PNG

# 图片元素更新语法
window[key].update()
window[key].Update()

# 图片元素的属性
filename=None,                # 图片路径仅支持GIF和PNG
data=None,                    # base64编码格式的字符串图片
background_color=None,        # 背景颜色设定
size=(None, None),            # 图片的宽度和高度
Pad=None,                        
tooltip=None,
right_click_menu=None,
visible=True
enable_events=False

# 图片元素可更新的属性
filename=None,
data=None,
size=(None, None),
visible=None

# 图片元素动图更新方法
window[key].update_animation(source,time_between_frames) 
window[key].UpdateAnimation(source,time_between_frames)
其中,source就是包含动画的gif文件,或者base64编码的字符串,time_between_frames表示显示帧之间要等待的毫秒数
# 示例
def test_image():
    layout = [
        [sg.Text("图片测试")],
        [sg.Image(filename=r"D:\LeStoreDownload\Wallpaper\1989-2023-01-11021542-1673417742682.png",key="Img1",size=(100,100))],
        [sg.Button("切换图片")]
    ]
    jpg_list = [
        r"D:\LeStoreDownload\Wallpaper\1989-2023-01-11021542-1673417742682.png",
        r"D:\LeStoreDownload\Wallpaper\8364-2023-01-11021402-1673417642121.png",
    ]
    windows = sg.Window("图片检测",layout=layout)
    while 1:
        event,value = windows.read()
        if event == None:
            windows.close()
            break
        elif event == "切换图片":
            windows["Img1"].update(
                filename=random.choice(jpg_list),
                size=(200,200)
            )

22.列元素

# 列元素语法
PySimpleGUI.Column()
PySimpleGUI.Col()
列元素是一个容器元素,用于在窗口的布局中创建布局。

# 列元素属性参数
layout = [[pg.Col( ,
                  background_color="",
                  size=None,
                  pad=None,
                  scrollable=True,              # 如果True,则滚动条将添加到该列
                  vertical_scroll_only=True,    # 如果为True,则不会显示水平滚动条
                  right_click_menu=None,
                  key=None,
                  visible=True,
                  justification="left",         # 为列本身对齐方式
                  element_justification="Center",   # 列内所有元素的对齐方式,"left","center","right"
                  vertical_alignment=None,      # 垂直对齐方式,"top","bottom","center"
                  grab=True,
                  expand_x=None,                # 如果为True.则列将自动沿x方向扩展以填充可用空间
                  expand_y=True,                # 如果为True,则列将自动沿y方向扩展以填充可用空间
                  ), pg.Col(layoutR)]]


# 示例
def test_col():
    layoutL = [
        [sg.T("左边")],
        [sg.InputText()]
    ]
    layoutR = [
        [sg.B("确认", size=(80, 40))]
    ]
    layout = [[sg.Col(layoutL), sg.Col(layoutR)]]
    wd = sg.Window("GOOD", layout, grab_anywhere=True)
    while True:
        event, values = wd.read()
        if event is None:
            wd.close()
            break

23.框架元素

# 框架元素语法
PySimpleGUI.Frame(title="",layout=layouya)

# 框架元素参数
layout = [[pg.Frame(title="",
                    layout=None,            # 框架元素内的布局
                    background_color="",
                    title_color="",
                    title_location=None,    # 标题所处位置:12个有效值 n(北)、nw(北西)、ne(北东)、
                                                                # e(东)、en(东北)、es(东南)
                                                                # s(南)、se(南东)、sw(南西)
                                                                # w(西)、ws(西南)、wn(西北)
                    relief="",              # 浮雕设计,"raised"、"sunken"、"flat"、"groove"、"ridge"、"solid"
                    size=(None, None),
                    font=None,
                    pad=None,
                    border_width=10,
                    tooltip="",
                    right_click_menu=None,
                    visible=True,
                    element_justification="",  # 框架内元素的对齐方式"left"/"right"/"center"
                    vertical_alignment=None,    # 垂直对齐方式top/bottom/center
]]
 
# 框架元素更新语法
window[key].Update()

# 框架元素可更新属性
value=None
visible=None
# 示例
def test_frame():
    layoutL = [
        [sg.T("账号"), sg.InputText()],
        [sg.T("密码"), sg.InputText()],
        [sg.B("确认", key="A")]
    ]
    layoutR = [
        [sg.B("确认", size=(80, 40))]
    ]

    layout = [
        [sg.Frame("登录框",layout=layoutL,key="B"),sg.Frame("恭喜",layout=layoutR,key="C",visible=False)]
    ]
    windows = sg.Window("Frame框架测试",layout=layout,grab_anywhere=True)
    while 1:
        event,value = windows.read()
        if event == None:
            windows.close()
            break
        elif event == "A":
            windows['B'].update(visible=False)
            windows['C'].update(visible=True)

24.标签元素

# 标签元素语法
PySimpleGUI.TabGroup([[sg.Tab("标题",布局),sg.Tab("标题",布局)]])
标签元素也是一种容器元素,里面可以放置各种元素及布局

# 标签元素的属性
layout = [
    [pg.TabGroup([[pg.Tab("智驾设置", layoutL,
                          background_color="",
                          font="",
                          pad=None,
                          disabled=False,
                          border_width=None,
                          key="",
                          tooltip=None,
                          right_click_menu=None,
                          visible=True,
                          element_justification="",     # 容器内元素的对齐方式left/right/center
                         ), pg.Tab("CRC", layoutR)]])]
]
# 标签组的元素属性
layout = [
    [pg.TabGroup([[pg.Tab("智驾设置", layoutL), pg.Tab("CRC", layoutR)]],
                 tab_location=None,             # 标签标题所处的位置,有效值12个,left/right/top/bottom/lefttop/leftbottom
                                                                        #   righttop/bottomleft,bottomright,topleft/topright
                 title_color="",                # 标题文本颜色(未选中时)
                 tab_background_color="",       # 所有标签背景颜色(未选中)
                 selected_title_color="",       # 标题文本颜色(中时)
                 selected_background_color="",  # 所有标签背景颜色(未选中)
                 background_color="",           # 标签标题所在空白区域的背景颜色
                 font=None,
                 enable_events=False,
                 pad=None,
                 border_width=None,
                 key="",
                 tooltip="",
                 visible=True
 
                 )]
]

# 可更新的属性参数
title=None
disabled=None
visible=None


# 示例

25.文件选择器

# 文件选择器语法
PySimpleGUI.FileBrowse()单文件
PySimpleGUI.FilesBrowse()多文件

# 文件选择器的属性
layout = [
    [pg.FileBrowse(button_text="",              # 按键显示文本
                   key="",                      # 记录路径的当行输入框的key,注意此key必须有对应的输入框
                   file_types=(("ALL Files", "*.*")),   # 寻找文件时,只显示对应文件或者对应类型的文件
                   initial_folder=r"",                   # 默认路径设定
                   
 
                   ), pg.In()]
# 
# 示例代码
    Sg.theme("LightGreen3")

    month_list = ['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月']
    day_abbreviations = ['日','一','二','三','四','五','六']

    layout = [
        [Sg.Text("选择数据日期"),Sg.Input(key="-date-"),
         Sg.CalendarButton(button_text="日历选择器",key='-choose_date-',format="%Y-%m-%d",close_when_date_chosen=True,
                           month_names=month_list,day_abbreviations=day_abbreviations,begin_at_sunday_plus=1),
         ],
        [Sg.Text("文件保存路径"),Sg.Input(key="-root_path-"),Sg.FolderBrowse(button_text="选择文件夹",target='-root_path-')],
        [Sg.Button("确定",key='-sure-'),Sg.Button("退出",key='-exit-')]
    ]

    windows = Sg.Window("企业微信通报自动处理",layout=layout,size=(900,900))

    while 1:
        event,value = windows.read()
        if event in (None,"退出","-exit-"):
            windows.close()
            break
        print(f"event={event}")
        print(value)

26.文件夹选择器和文件另存为

# 文件夹选择器
PySimpleGUI.FolderBrowse()

layout = [
    [pg.FolderBrowse(button_text="",
                     target="key",              # 指定存放目录地址的元素key
                     initial_folder=None,       # 设定默认路径
                     ), pg.In()]
]

# 文件另存为
PySimpleGUI.FileSaveAs()

layout = [
    [pg.FolderBrowse(button_text="",
                     target="key",              # 指定存放目录地址的元素key
                     initial_folder=None,       # 设定默认路径
                     ), pg.In()],
    [pg.FileSaveAs(button_text="",
                   target="key",
                   file_types=("ALL Files", "*.*"),)]
]
# 示例代码

27.颜色选择器

# 颜色选择器
PySImpleGUI.ColorChooserButton("button_text="")

# 属性
button_text=None
target=key 
# 示例代码

28.日历选择器

# 日历选择器
PySimpleGUI.CalendarButton(button_text="")

# 属性参数
[pg.CalendarButton(button_text="日历选择器",
                   close_when_date_chosen=True,         # 选择日期后关闭日历界面
                   default_date_m_d_y=(月份, 日期, 年份),  # 设置默认打开日期后显示的日期
                   locale="",                           # 区域设定
                   format="%Y-%m-%d %H:%M:%S",          # 设定显示的格式,可以给更换位置
                   begin_at_sunday_plus=0,              # 设定日历显示第一天的星期Day
                   month_names=None,                    # 指定月份的列表
                   day_abbreviations=None,              # 指定星期的列表
                   title="",                            # 选择窗口的标题
                   no_titlebar=False,                   # 不显示日期窗口的标题
                   location=(None, None)                # 日历窗口的位置
                  )]]
# 示例代码
Sg.theme("LightGreen3")

month_list = ['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月']
day_abbreviations = ['日','一','二','三','四','五','六']

layout = [
    [Sg.Text("选择数据日期"),Sg.Input(key="-date-"),
     Sg.CalendarButton(button_text="日历选择器",key='-choose_date-',format="%Y-%m-%d",close_when_date_chosen=True,
                       month_names=month_list,day_abbreviations=day_abbreviations,begin_at_sunday_plus=1),
    ],
    [Sg.Text("文件保存路径"),Sg.Input(key="-root_path-"),Sg.FolderBrowse(button_text="选择文件夹",target='-root_path-')],
    [Sg.Button("确定",key='-sure-'),Sg.Button("退出",key='-exit-')]
]

windows = Sg.Window("企业微信通报自动处理",layout=layout,size=(900,900))

while 1:
    event,value = windows.read()
    if event in (None,"退出","-exit-"):
        windows.close()
        break
        print(f"event={event}")
        print(value)

29.弹窗的设定

# 弹窗的语法
PySimpleGUI.popup()

# 属性参数
[pg.popup(title="",             # 弹窗标题
          button_color=None,    # (文本颜色,背景颜色)
          background_color="",  # 弹窗的背景颜色
          text_color="",        # 弹窗上面的文本颜色
          auto_close=False,     # 弹窗是否自动关闭
          auto_close_duration=None, # 弹窗自动关闭前需要显示的事件(以s为单位)
          custom_text=(None, None),      # 自定义窗口按钮上的文本,可以设定一个、两个
          non_blocking=False,   # 非租塞设定,如果为true,则弹窗不会影响程序下一步,否则需要等待用户输入
          font=None,
          no_titlebar=True,     # 不显示标题栏
          grab_anywhere=True,
          keep_on_top=False,    # 保持界面在屏幕的最前方
          location=(None, None),    # 设置弹窗的位置
          any_key_closes=False,     # 任意键关闭弹窗
          image=None,               # 显示图片(支出base64)
          modal=True,               # 模态窗口设定,除非关闭此窗口,否则不能操作其他界面

         )]
]

# 弹窗的返回值
弹窗的返回值是根据所点击的按键来返回的,即按钮的名字,或者按键关闭激活后的按键名字
# 示例代码

30.弹窗输入框

# 语法
PySimpleGUI.PopupGetText()

# 弹窗输入框的返回值
PySimpleGUI.PopupGetText()返回的就是输入的值

# exit()直接退出主程序
# 示例代码

31.其他弹窗

1)文件夹选择弹窗:

        PySimpleGUI.PopupGetFile() / PySimpleGUI.popup_get_file()

2)没有标题的弹窗,可以随意移动窗口:

        PySimpleGUI.PopupGetFolder() / PySimpleGUI.popup_get_folder()

3)显示一段时间后自动关闭窗口:

        PySimpleGUI.PopupAnnoying()

4)含有一个cannelled的按钮

        PySimpleGUI.PopupCancel()

5)弹窗含有ok和cancel两个按钮

        PySimpleGUI.PopupOKCancel()

6)含有一个颜色的Error按钮

        PySimpleGUI.PopupError()

7)显示无按钮的弹窗

        PySimpleGUI.PopupNoButtons()

8)闪现的弹窗

        PySimpleGUI.PopupNoWait()

32.菜单栏

# 菜单栏的语法、书写方式
通过menu写菜单,在layout中加菜单即可
meun = [
        ["文件(&F)", ["保存", "!不可选", "---", "退出"]]
]

# 菜单栏的重点补充
meun = [
        ["文件(&F)", ["保存::保存", "!不可选", "---", "退出"]]
]

# 在对应选项旁边加::就可以指定key
[pg.Menu(meun, key="A", tearoff=True)],

# tearoff设置菜单栏是否可以独立出来
# 示例代码

33.windows属性

wd = PySimpleGUI.Window("GOOD", layout, grab_anywhere=True,
                        location=(None, None),
                        size=(None, None),
                        element_padding=((x,y),(m,n)),      # 界面内所有元素的间隔
                        button_color=("",""),               # 按键元素颜色统一设定,文本颜色,背景颜色
                        font="",
                        background_color="",
                        auto_close=False,                   # 界面自动关闭3s
                        auto_close_duration=x,              # 默认界面自动关闭为3s
                        no_titlebar=False,                  # 是否需要窗口标题栏
                        keep_on_top=False,                  # 界面保持最前方
                        resizable=True,                     # 界面生成后,可以调整大小
                        disable_close=False,                # 如果为True,窗口关闭按钮将不起作用
                        disable_minimize=False,             # 如果为True,将不能最小化窗口
                        right_click_menu=None,
                        transparent_color=None,             # 界面透明度设定
                        element_justification="left",       # 元素对齐方式,"left"/"right"/"center"
                        )

34.多行文本框

# 语法
PySimpleGUI.ML()

# 属性
[pg.ML(default_text="",             # 默认文本
       disabled=True,               # 禁用状态
       border_width=None,           # 边界线宽度设定
       size=(x,y),                  # 宽度和行高设定
       background_color=None,
       text_color=None,
       enable_events=True,          # 设定后,点击元素会返回key
       key="",
       write_only=False,            # 只写
       reroute_stdout=False,        # True时,print语句内容会显示在此文本框内
       reroute_cprint=True,         # 使用cprint将内容打印到此文本框内
       reroute_stderr=False,        # 步骤异常时,将文本写在此元素内,sys.stderr.write("")
       autoscroll=True,             # 更多数据添加到末尾时,元素的内容将自动滚动
       focus=False,
       font=None,
       pad=None,
       tooltip="",
       justification=None,          # 对齐方式设定
       right_click_menu=None,
       visible=True,
       do_not_clear=True,           # 窗口读取一次,内容就会自动清除
      )],

# 可更新属性
wd["AAA"].update(value="",
                 disabled=None,
                 append=False,          # 如果为True,要更新内容会接在原本文本下方,原来的不会消失
                 font=None,
                 text_color=None,
                 background_color=None,
                 text_color_for_value=None,
                 visible=None,
                 autoscroll=None,
                 justification=None,
                )

# 关于cprint方法:  PySimpleGUI.cprint() 、 PySimpleGUI.print()

[pg.cprint("", end=None,            # 结束符,默认为回车键
           sep=None,            # 分隔符,默认为空格键
           text_color=None,
           background_color=None,
           colors=None,
           key=None,
           justification="对齐方式"
          )]

# 元素之间的垂直分隔线  PySimpleGUI.VerticalSeparator(color=None,key=None,pad)
# 示例代码

35.表格元素

# 语法
PySimpleGUI.Table()

# 属性
[sg.Table(headings=a,               # 表格头部
          max_col_width=None,       # 所有列的最大宽度
          auto_size_columns=False,  # 是否自动适应列宽度
          def_col_width=None,       # 定义列表宽度
          display_row_numbers=False,  # 是否显示序列号
          justification="l",        # 对其方式
          num_rows=10,              # 定义行数
          row_height=30,            # 定义行高
          key="",
          font=("黑体", 10),
          text_color=None,
          background_color="red",
          enable_events=True,
          bind_return_key=True
         )]

# 示例代码