pysimplegui快速入门-根据官方英文文档编写
原创长期更新直到整个文档完成建议关注收藏event, values = window.read()#都是窗口读取的#event指用户的任何动作#values是元素值的字典,区分每个元素则用keys来特定,默认从0开始,详细来说text_input = values[0]#获取第一个输入元素的值#用户可以自己定义键sg.InputText(key='-IN-')#这指的一个输入文本框text_inp
·
原创
长期更新直到整个文档完成
建议关注收藏
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
更多推荐
所有评论(0)