原创
长期更新直到整个文档完成
建议关注收藏

event, values = window.read()    
#都是窗口读取的
#event指用户的任何动作
#values是元素值的字典,区分每个元素则用keys来特定,默认从0开始,详细来说
text_input = values[0]  #获取第一个输入元素的值
#用户可以自己定义键
sg.InputText(key='-IN-')#这指的一个输入文本框
text_input = values['-IN-'] #可以取到这个文本框中的内容
#如果还没输入就关闭了窗口 则该值为None
#关闭这个事件的代号也是None
'''
窗口分为两种:
1、读完关闭one-shot
2、长期保持persistent
长期保持的原因在于它比one-shot多了事件循环 即
while True:                             # The Event Loop
    event, values = window.read() 
    print(event, values)       
    if event in (None, 'Exit'):      
        break   
window.close()
'''
#整个界面的布局框架代码如下
layout = [[sg.Text('Your typed chars appear here:',background_color='#F7F3EC', justification='center', relief=sg.RELIEF_RIDGE), sg.Text(size=(15,1), key='-OUTPUT-')],
          [sg.Input(key='-IN-')],
          [sg.Button('Show'), sg.Button('Exit')]]          
#其中sg.Text(size=(15,1), key='-OUTPUT-')是输出文本,放置在哪个[]中表示在哪一行 
relief=sg.RELIEF_RIDGE #字体区域块呈现凹陷效果
auto_size_text=False, justification='right'#还有这些属性

#点击按钮show更新页面
if event == 'Show':
        window['-OUTPUT-'].update(values['-IN-'])#这样就可以将-in-框中输入的值更新在对应的位置-output-
#`window['-OUTPUT-']`返回具有键`'-OUTPUT-'`的元素。 然后调用该元素的`update`方法,以便修改`Text`元素的值。
#该语句与以下3种同理
window.FindElement('-OUTPUT-').update(values['-IN-'])
or
window.Element('-OUTPUT-').update(values['-IN-'])

window[my_key].set_tooltip('New Tooltip')#直接设置值
#`window[key]`表示您正在该窗口中找到一个元素。 语句那部分之后的所有内容都意味着您正在直接使用元素

'''
关于退出窗口
if event in (None, 'Quit'):
    break
等价于
if event is None or event == 'Quit':
    break
退出循环后是window.close()
'''

#选择各种颜色的主题
import PySimpleGUI as sg
sg.preview_all_look_and_feel_themes()
theme_name_list = sg.theme_list()
#也可以自己设置参数
[sg.Text('My Theme Previewer', font='Default 18', background_color='black')] 
#字体区域背景色是黑色
sg.T('0', key='_LEFT_'),#也是文本

sg.theme_button(('black', '#6D9F85'))
sg.Button('', image_data=red_x_base64, button_color=sg.COLOR_SYSTEM_DEFAULT, border_width=0, image_subsample=8, key='Exit')
`image_subsample`值指示将尺寸“除”多少。 上面指定的值“8”表示使用原始尺寸的1/8。 如果值为“2”,则将显示原始大小的1/2。
sg.Button('', image_data=red_x_base64, button_color=('white',sg.theme_background_color()), border_width=0, image_subsample=8, key='Exit'#提示
sg.popup("window_name", "note",line_width =100)#行间隔为100
sg.popup('The filename you chose was', fname)#输出变量
'The button clicked was "{}"'.format(event)#可将变量放入{}对应位置
window['_OUTPUT_'].update('{:02d}:{:02d}.{:02d}'.format((counter // 100) // 60, (counter // 100) % 60, counter % 100))
#:02d转换成整数

#判断事件:直接if else
if len(sys.argv) == 1: #系统参数是1 毫无疑问往下走
    layout = [[sg.Text('Document to open')],
              [sg.In(), sg.FileBrowse()],
              [sg.Open(), sg.Cancel()]]

    window = sg.Window('My Script', layout)
    event, values = window.read()
    window.close()
#还有一条命令可以代替上述全部的功能 即fname = sg.popup_get_file('Document to open')
    fname = values[0]
    print(event, values)
else:#选择多个 只取1号
    fname = sys.argv[1]

if not fname:
    sg.popup("Cancel", "No filename supplied")#提示
    raise SystemExit("NOTE")#系统退出并报错 note:报错文本
else:
    sg.popup('The filename you chose was', fname)

#顶部菜单
# ------ Menu Definition ------ #      
menu_def = [['File', ['Open', 'Save', 'Exit', 'Properties']],      
            ['Edit', ['Paste', ['Special', 'Normal', ], 'Undo'], ],      
            ['Help', 'About...'], ]      
#将其加入布局请将以下语句放入layout=[]中
[sg.Menu(menu_def, tearoff=True)], 

#列
#列定义
column1 = [[sg.Text('Column 1', background_color='#F7F3EC', justification='center', size=(10, 1))],
           [sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 1')],
           [sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 2')],
           [sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 3')]]
#将其加入布局请将以下语句放入layout=[]中
sg.Column(column1, background_color='#F7F3EC')

#框起某区域 frame(包起来)
[sg.Frame(layout=[
        [sg.Checkbox('Checkbox', size=(10, 1)), sg.Checkbox('My second checkbox!', default=True)],
        [sg.Radio('My first Radio!     ', "RADIO1", default=True, size=(10, 1)),
         sg.Radio('My second Radio!', "RADIO1")]], title='Options', title_color='red', relief=sg.RELIEF_SUNKEN,
        tooltip='Use these to set flags')],
        #tooltip是提示文字
#Checkbox多选 Radio单选
title='Options', title_color='red', relief=sg.RELIEF_SUNKEN,
        tooltip='Use these to set flags')#都是框体标题及样式
#可滚动的多行文本输入框
sg.Multiline(default_text='This is the default Text should you decide not to type anything', size=(35, 3))
#下拉选择框
sg.InputCombo(('Combobox 1', 'Combobox 2'), size=(20, 1))
or
sg.Drop(values = ('BatchNorm', 'other'), auto_size_text =
            True)
#左右滑动条
sg.Slider(range=(1, 100), orientation='h', size=(34, 20), default_value=85)]
sg.Slider((1, 100), key='_SLIDER_', orientation='h', enable_events=False, disable_number_display=False)
#enable_events 能否触发事件
#disable_number_display 是否显示滑动条上面居中的表示数字
#更好看的下拉选择框
sg.InputOptionMenu(('Menu Option 1', 'Menu Option 2', 'Menu Option 3'))
#但这个下拉框mac机型上食用不佳
#竖型可选择框
sg.Listbox(values=('Listbox 1', 'Listbox 2', 'Listbox 3'), size=(30, 3)
#竖型滑动条
sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=25,select_mode=sg.LISTBOX_SELECT_MODE_MULTIPLE,sg.Column(col, background_color ='blue'))
#orientation='vertical' 加这个属性成为竖型
#设置多选
#加入右边列并设置背景颜色
#横向分割线
sg.Text('_' * 80)
#文件夹选择
[sg.Text('Choose A Folder', size=(35, 1))],
    [sg.Text('Your Folder', size=(15, 1), auto_size_text=False, justification='right'),
     sg.InputText('Default Folder'), sg.FolderBrowse()],
    [sg.Submit(tooltip='Click to submit this window'), sg.Cancel()]
#输入框
[sg.Input('Last input')],#文本是默认文字
#输出框 
[sg.Output(size = (88, 20))],
#进度条
 [sg.ProgressBar(1000, orientation='h', size=(20, 20), key='progbar')],
  window['progbar'].update_bar(i + 1)
#图片 仅接受png gif格式
[ sg.Image(size = (50, 50), key = "-WEATHER-IMG-") ]
#常见的JPG、TIFF格式是不能被其调用的。如果想调用的话可以用Python中的另一个库Pillow来转换。或者是调用pil库将jpg格式转换成png格式即可 亲测有效


#设置按钮回调
def button1():
    print('Button 1 callback')
# Lookup dictionary that maps button to function to call查找字典来绘制按钮给回调函数
dispatch_dictionary = {'1':button1, '2':button2}
if event in dispatch_dictionary:
        func_to_call = dispatch_dictionary[event]  #从字典中取出对应事件
        func_to_call()#调用
    else:
        print('Event {} not in dispatch dictionary'.format(event))

#进度条
for i in range(1000):
    sg.OneLineProgressMeter('One Line Meter Example', i + 1, 1000, 'key')

#按钮网格 参考扫雷
conda install PySimpleGUIWeb
#安装好后跑这个包会弹出网页展示代码效果
MAX_ROWS = MAX_COL = 10 #设定长宽
board = [[randint(0,1) for j in range(MAX_COL)] for i in range(MAX_ROWS)] #二重循环 结构是十行十列的矩阵[[],[],...]

layout =  [[sg.Button('?', size=(4, 2), key=(i,j), pad=(0,0)) for j in range(MAX_COL)] for i in range(MAX_ROWS)]
#同样是二重循环渲染组件
#设置key值为坐标形式 pad指元素间隔
event, values = window.read()
#点击元素后window.read()就会读到相应信息
window[event].update(board[event[0]][event[1]], button_color=('white','black'))
#更新页面
button_color=('white','black'))#该属性指按钮背景是黑色,字体颜色是白色
#以上我们可以得出 键、事件可以是任何类型而不仅限于字符串

#带图片的按钮
#定义按钮gui
def MediaPlayerGUI():
    background = '#F0F0F0'
    # Set the backgrounds the same as the background on the buttons
    sg.SetOptions(background_color=background, element_background_color=background)
    # Images are located in a subfolder in the Demo Media Player.py folder
    image_pause = './ButtonGraphics/Pause.png'
    image_restart = './ButtonGraphics/Restart.png'
    image_next = './ButtonGraphics/Next.png'
    image_exit = './ButtonGraphics/Exit.png'
sg.SetOptions(background_color=background, element_background_color=background)#设置背景颜色以及元素的背景颜色

#设置可变的一行字
[sg.Text(size=(15, 2), font=("Helvetica", 14), key='output')],
#常用来做间隔 
 sg.Text(' ' * 2)
#以下就是layout
[sg.Button('', button_color=(background,background),image_filename=image_restart, image_size=(50, 50), image_subsample=2, border_width=0, key='Restart Song')]
#每100ms轮询一次
event, values = window.read(timeout=100)  
#除了超时事件之外的都需要更新
if event != sg.TIMEOUT_KEY:
            window['output'].update(event)

#实例:终端
#定义终端
def ExecuteCommandSubprocess(command, * args):
'''
捕捉异常可以使用try/except语句。
try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
如果你不想在异常发生时结束你的程序,只需在try里捕获它。
'''
    try:
        sp = subprocess.Popen([command, * args], shell = True, stdout =subprocess.PIPE, stderr = subprocess.PIPE)
        out, err = sp.communicate()
        if out:#二进制流均需要解码
            print(out.decode("utf-8"))
        if err:
            print(err.decode("utf-8"))
    except:
        pass

layout = [
    [sg.Text('Script output....', size = (40, 1))],
    [sg.Output(size = (88, 20))],
    [sg.Button('script1'), sg.Button('script2'), sg.Button('EXIT')],
    [sg.Text('Manual command', size = (15, 1)), sg.InputText(
        focus = True), sg.Button('Run', bind_return_key =True)]#绑定回车键
]
window = sg.Window('Script launcher', layout)
while True:
    (event, value) = window.read()
    if event == 'EXIT' or event is None:
        break# exit button clicked
    if event == 'script1':
        ExecuteCommandSubprocess('pip', 'list')
    elif event == 'script2':
        ExecuteCommandSubprocess('python', '--version')
    elif event == 'Run':
        ExecuteCommandSubprocess(value[0])

#实例:网页启动工具
import subprocess
import PySimpleGUI as sg

CHROME = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"

layout = [[sg.Text('Text area', key='_TEXT_')],
          [sg.Input(key='_URL_')],#在这里输入网址
          [sg.Button('Chrome'), sg.Button('Exit')]]

window = sg.Window('Window Title', layout)

while True:  # Event Loop
    event, values = window.read()
    print(event, values)
    if event is None or event == 'Exit':
        break
if event == 'Chrome':
    sp = subprocess.Popen([CHROME, values['_URL_']], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
window.close()
#可以简写成
event, values = sg.Window('Compact 1-line Window with column', layout).Read()

#多窗口 多个窗口,新窗口出现时旧窗口便处于不活动状态并隐藏以免影响交互
layout = [[sg.Text('Window 1'), ],
          [sg.Input()],
          [sg.Text('', key='_OUTPUT_',size=(100,20))],
          [sg.Button('Launch 2')]]
win1 = sg.Window('Window 1', layout)
win2_active = False #重点1 设为未激活
while True:
    ev1, vals1 = win1.Read(timeout=100)#timeout可以设一定间隔时间,开销变少
    if ev1 is None:
        break
    win1['_OUTPUT_'].update(vals1[0])
    if ev1 == 'Launch 2' and not win2_active:#not等于!即win2_active不为false 
        win2_active = True
        win1.Hide()#重点2:激活新窗口,隐藏旧窗口
        layout2 = [[sg.Text('Window 2')],  # note must create a layout from scratch every time. No reuse注意每次都必须从头开始创建布局。不重用
               [sg.Button('Exit')]]
        win2 = sg.Window('Window 2', layout2)
        while True:#重点3:同样要配一个while循环
            ev2, vals2 = win2.Read()
            if ev2 is None or ev2 == 'Exit':
                win2.Close()#重点4:新窗口关闭后关闭激活,取消隐藏旧窗口
                win2_active = False
                win1.UnHide()
                break
win1.close()

#实例:键盘输入
#布局设计
layout = [[sg.Text('Enter Your Passcode')],
          [sg.Input(size=(10, 1), justification='right', key='input')],
          [sg.Button('1'), sg.Button('2'), sg.Button('3')],
          [sg.Button('4'), sg.Button('5'), sg.Button('6')],
          [sg.Button('7'), sg.Button('8'), sg.Button('9')],
          [sg.Button('Submit'), sg.Button('0'), sg.Button('Clear')],
          [sg.Text(size=(15, 1), font=('Helvetica', 18), text_color='red', key='out')]]
#按钮还有一个属性是disabled = True/False表示是否禁用
window = sg.Window('Keypad', layout, default_button_element_size=(5,2), auto_size_buttons=False)
#设置默认按钮的大小(宽,高) 取消掉按钮大小自动设置

keys_entered = ''#定义变量
while True:
    event, values = window.read()  # read the window
    if event is None:  # if the X button clicked, just exit
        break
    if event == 'Clear':  # clear keys if clear button
        keys_entered = ''
    elif event in '1234567890':#其中之一即满足条件
        keys_entered = values['input']  # get what's been entered so far
        keys_entered += event  # add the new digit
    elif event == 'Submit':
        keys_entered = values['input']#定义提交变量
        window['out'].update(keys_entered)  # output the final string 
    window['input'].update(keys_entered)  # change the window to reflect current key string  每次循环都会更新一次keys_entered输出到文本框

import matplotlib.pyplot as plt#还可以引入交互plt
def draw_plot():
    plt.plot([0.1, 0.2,1, 0.5, 0.7])#设置纵坐标的y值
    plt.show(block=False)#block暂时没发现有什么区别
    
window = sg.Window('SHA Generator', layout, auto_size_text =
False, default_element_size = (10, 1),text_justification = 'r', return_keyboard_events = True,grab_anywhere = False)
#grab_anywhere是鼠标是否可以选择进行复制粘贴等操作
#return_keyboard_events是否允许键盘触发事件

#Password Protection For Scripts~Desktop Floating Widget - CPU Utilization 感觉暂时用不上,暂时不更了,如果评论有催我的我再更

#菜单 就是顶部的那一条
 # -- -- --Menu Definition-- -- --#
menu_def = [
        ['File', ['Open', 'Save', 'Exit']],
        ['Edit', ['Paste', ['Special', 'Normal', ], 'Undo'], ],
        ['Help', 'About...'],
    ]
 # -- -- --GUI Defintion-- -- --#
layout = [
        [sg.Menu(menu_def, )],
        [sg.Output(size = (60, 20))]
    ]
#浏览
filename = sg.popup_get_file('file to open', no_window = True)

#Tabs选项卡
#定义两个tab及内部布局
tab1_layout = [[sg.T('文字识别')],
               [sg.In(), sg.FileBrowse(),sg.Open(), sg.Button('Reset')]
               ]
#放入
layout = [  [sg.Text('Welcome to my project!')],
            [sg.TabGroup([[sg.Tab('Tab 1', tab1_layout,key='tab1'),
                           sg.Tab('Tab 2', tab2_layout, key='tab2'),
                           sg.Tab('Tab 3', tab3_layout,key='tab3'),
                           sg.Tab('Tab 4', tab4_layout,key='tab4')
                           ]], key='_TABGROUP_')],
        ]

#创建windows exe类型文件:好处在于不需要在pc上安装python解释器
pip install PySimpleGUI      
pip install PyInstaller 
程序 `my_program.py` 创建EXE文件,请在Windows命令提示符下输入以下命令:
pyinstaller -wF my_program.py      
将只剩下一个文件 `my_program.exe` ,位于执行 `pyinstaller` 命令的文件夹下名为 `dist` 的文件夹中。
您的EXE文件应该在没有创建“命令窗口”的情况下运行。 仅GUI窗口应显示在任务栏上。

#隐藏显示相应组件
window.Element('_moduletext_').Update(visible = False) 
 window.Element('_moduletext_').Update(visible = True)

Canvas\Graph部分暂时不出了,如果有想看的可以评论我,有的话再出~

sg.frame的浮雕(边框)效果即relief属性展示
sg.RELIEF_SUNKEN
在这里插入图片描述
sg.RELIEF_RAISED
在这里插入图片描述
sg.RELIEF_FLAT :无边框
sg.RELIEF_RIDGE:在这里插入图片描述
sg.RELIEF_GROOVE(看起来和上一个没什么区别)和sg.RELIEF_SOLID在这里插入图片描述

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐