PySimpleGUI笔记

news/2024/11/18 9:26:35/文章来源:https://www.cnblogs.com/TheHypocrite/p/18292993

PySimpleGUI --Python图形化界面库

4.60.5版本及之前都是免费的,现在5.0.0版本之后开始收费了。

太贵了跑路了

安装:

pip install PySimpleGUI

1 布局模板

1.1 常用布局

import PySimpleGUI as sglayout = [[],[],[],[],[],
]
#每个[]是一行
window = sg.Window('',layout)while True:event,values = window.read()if event == None:break
window.close()

image

1.2 加号布局

import PySimpleGUI as sglayout = [[sg.Text('请输入基本信息')],[[sg.Text('姓名')]+[sg.In()]]+[[sg.Text('性别')]+[sg.In()]]+[[sg.Text('国籍')]+[sg.In()]]+[[sg.B('确认')]+[sg.B('取消')]]
]
window = sg.Window('Python布局2',layout)
while True:event, values =window.read()if event == sg.WIN_CLOSED:breakif event == '确认':break
window.close()

1.3 循环布局

import PySimpleGUI as sglayout = [[[sg.In(i)] for i in ['姓名','性别','国籍']]
]window = sg.Window('Python',layout)while True:event, values =window.read()if event == sg.WIN_CLOSED:breakwindow.close()

2 菜单

2.1 菜单栏

  	menu_def = [['&File', ['&New', '&Open', '!Save', 'E&xit', ]],['&Edit', ['C&ut', '&Copy::CP', '&Paste', '&Undo'], ],['&Help', '&About...'], ]

image

2.2 右键菜单

rightclick=['&Edit', ['C&ut', '&Copy','&Paste', '&Undo']]
menu_def = [['&File', ['&New', '&Open', '&Save', 'E&xit',]], rightclick,['&Help', '&About...'],
]
#将其用作 Window 构造函数中 right_click_menu 参数的值
window=psg.Window("Menu", layout, size=(715, 300), right_click_menu=rightclick)

3 弹出窗口

3.1 基本弹窗

  • popup_ok − 仅显示带有 OK 按钮的 Popup
  • popup_ok_cancel − 显示带有 OK 和 Cancel 按钮的弹出窗口
  • popup_cancel − 显示带有"cancelled"已取消按钮文本的弹出窗口
  • popup_yes_no − 显示带有 Yes 和 No 按钮的弹出窗口
  • popup_error − 带有彩色按钮和"Error"错误作为按钮文本的弹出窗口

这些函数返回用户按下的按钮的文本。 例如,如果用户按下 ok-cancel 弹出窗口的 OK 按钮,它会返回 Ok,这可以在进一步的编程逻辑中使用。

以下弹出窗口接受用户以文本形式输入或让用户从选择器中选择文件/文件夹/日期。

  • popup_get_text − 显示带有文本输入字段的弹出窗口。 返回输入的文本,如果关闭/取消则返回 None

  • popup_get_file − 显示带有文本输入字段和浏览按钮的弹出窗口,以便用户可以选择文件。

  • popup_get_folder − 显示带有文本输入字段和浏览按钮的弹出窗口,以便可以选择文件夹。

  • popup_get_date − 显示一个日历窗口,获取用户的选择,以元组形式返回(mon, day, year)

  • popup_scrolled − 滚动弹窗

    import PySimpleGUI as sg
    pwd = '123'
    list = ['资料1','资料2','资料3','资料4']
    while True:result = sg.PopupGetText('密码输入框')if pwd ==result :breakelif result ==None:exit()else:sg.popup('密码错误')
    layoutb=[[sg.LB(list,size=(30,5))]]
    layout=[[sg.Frame('资料库',layoutb)]]window=sg.Window('演示',layout)
    while True:event, values = window.read()if event == None:breakwindow.close()
    """
    sg.PopupGetFile()#文件选择弹窗
    sg.PopupGetFolder()#文件夹选择
    sg.PopupAnnoying()#没有标题栏可随意移动
    sg.PopupAutoClose()#显示一段时间自动关闭
    sg.PopupCancel()
    sg.PopupOKCancel()
    sg.PopupOK()
    sg.PopupError()
    sg.PopupNoButtons()
    """
    

    运行截图:

image

点击OK

image

4 元素类

Text 文本元素 在窗口中显示一些文本。 通常这意味着单行文本。
Input 输入元素 显示单个文本输入字段。
Multiline 多行元素 显示和/或阅读多行文本。 这既是输入元素也是输出元素。
Combo 组合元素 单行输入和下拉菜单的组合。
OptionMenu 元素 类似于 Combo。 仅在 TKinter 端口上
Checkbox 复选框元素 显示复选框和旁边的文本。 CB
Radio 单选元素 在一组其他单选元素中使用,使用户能够在选项列表中仅选择一个选项。 R
Spin 元素 带有向上/向下按钮和单行文本的旋转器。
Button 按钮元素 定义所有可能的按钮。 诸如 Submit、FileBrowse 之类的快捷方式……每个都创建一个 Button
ButtonMenu 按钮菜单元素 创建一个按钮,单击该按钮将显示类似于右键单击菜单的菜单。
Slider 滑块元素 用于递增/递减值的水平或垂直滑块。
Listbox 列表框元素 提供一个值列表供用户选择一个或多个。 执行 window.read() 时返回选定行的列表。
Image 图像元素 在窗口中显示图像。 应仅为 GIF 或 PNG。
Graph 图形元素 创建绘制图形的区域
Canvas 画布元素 绘制形状的区域
ProgressBar 进度条元素 显示一个彩色条,该条在某些操作的进度中带有阴影。
Table 表格元素 在行和列中显示数据
Tree 树元素 以树状方式呈现数据,很像文件/文件夹浏览器。
Sizer 元素 此元素用于添加更多空间。
StatusBar 元素 StatusBar 元素在底部创建凹陷的文本填充条。
Frame 框架元素 Frame 元素是一个容器对象,它包含一个或多个其他类型的元素。
Column 列元素 如果你想设计一个或多个垂直列表示的 GUI 窗口元素,这将非常有用。
Tab 元素 Tab 元素的使用使设计非常方便、有效且易于用户导航。 Tab 元素也是一个容器元素,例如 Frame 或 Column。

4.1 元素类方法

set_tooltip() 由应用程序调用以更改元素的工具提示文本
set_focus() 将当前焦点设置在此元素上
set_size() 将元素的大小更改为特定大小
get_size() 以像素为单位返回元素的大小
expand() 使元素扩展以填充 X 和 Y 方向的可用空间
set_cursor() 为当前元素设置光标
set_right_click_menu() 设置单击时调用的右键单击菜单

5 主题

import PySimpleGUI as sgprint(sg.theme_list())
sg.theme('DarkRed')
sg.Popup('弹窗演示')
# print(sg.theme_button_color())
sg.theme_button_color(('black', '#ad1d45'))
sg.Popup('演示弹窗','按键字体变黑色')

6 将程序打包成exe

安装pysimplegui-exemaker:

pip install pysimplegui-exemaker

运行:

python -m pysimplegui-exemaker.pysimplegui-exemaker

7 各种例子

以下是在下学习PySimpleGUI过程中的用到的实例

7.1 下拉菜单

import PySimpleGUI as sg
list=['Python','JavaScript','C/C++','PHP','Java','C#','go','vue','VB']layout=[[sg.Drop(list,default_value='Python',key='-LIST-',size=(30,6),enable_events=None,bind_return_key=None,font=('楷体',20),background_color='yellow',text_color='red',pad=20,tooltip='列表',visible=True,auto_size_text=True)]]
window=sg.Window('列表',layout)
while True:event, values =window.read()if event == None:breakif event == '-LIST-':print(values)window.close()

7.2 下拉菜单更新

import PySimpleGUI as sg
#通过值获取键
def get_keys_by_value(dictionary, value):keys = []for key, val in dictionary.items():if val == value:keys.append(key)return "".join(keys)
dict ={'河南':'郑州','河北':'石家庄','浙江':'杭州','湖北':'武汉'}
list1 = []
list2 = []
for i in dict:list1.append(i)
for i in dict:list2.append(dict[i])
layout = [[sg.Combo(list1,key='-DICT1-',size=(40,6),enable_events=True)],[sg.T('行政中心'),sg.Input(key='-INPUT-',size=(30))],[sg.Combo(list2,key='-DICT2-',size=(40,6),enable_events=True)]]
window = sg.Window('演示',layout)while True:event, values =window.read()if event == None:breakif event == '-DICT1-':window['-DICT2-'].update(dict[values['-DICT1-']])window['-INPUT-'].update(dict[values['-DICT1-']])if event == '-DICT2-':window['-DICT1-'].update(get_keys_by_value(dict,values['-DICT2-']))
window.close()

7.3 中英切换

import PySimpleGUI as sglayout = [[sg.B('中文'),sg.B('English')],[sg.T('请输入基本信息',key='-Text1-')],[sg.Text('姓名',key='-Name-',size=(8,1)),sg.InputText()],[sg.Text('性别',key='-Sex-',size=(8,1)),sg.InputText()],[sg.Text('国籍',key='-Nationality-',size=(8,1)),sg.InputText()],[sg.Button('确认',key='-Confirm-',size=(8,1)),sg.Button('取消',key='-Cancel-')]]
window = sg.Window('Python GUI',layout)while True:event, values =window.read()if event ==None:breakif event =='English':window['-Text1-'].update(value='Please enter basic information')window['-Name-'].update(value='Name')window['-Sex-'].update(value='Sex')window['-Nationality-'].update(value='Nationality')window['-Confirm-'].update(text='Confirm')window['-Cancel-'].update(text='Cancel')if event =='中文':window['-Text1-'].update(value='请输入基本信息')window['-Name-'].update(value='姓名')window['-Sex-'].update(value='性别')window['-Nationality-'].update(value='国籍')window['-Confirm-'].update(text='确认')window['-Cancel-'].update(text='取消')window.close()

7.4 列元素

import PySimpleGUI as sglayoutL = [[sg.T('标题')],[sg.In('请输入文章标题')],[sg.T('作者')],[sg.In('请输入姓名或笔名')]]
layoutR = [[sg.ML('请输入正文内容',size=(30,20))],[sg.B('确认提交')],]
layout = [[sg.Col(layoutL,background_color='black',size=(200,100),scrollable=True,vertical_scroll_only=None,right_click_menu=None,visible=True,justification='left',element_justification='Center',vertical_alignment='top',grab=True,#True可以拖动expand_x=True,expand_y=True),sg.Col(layoutR)]]
window = sg.Window('列元素',layout)
while True:event, values = window.read()if event == None:breakwindow.close()

7.5 列表

import colorsysimport PySimpleGUI as sg
list=['Python','JavaScript','C/C++','PHP','Java','C#','go','vue','VB']layout=[[sg.LB(list,# default_values=['Python'],key='-LIST-',select_mode='extended',size=(30,6),enable_events=None,bind_return_key=None,font=('楷体',20),background_color='yellow',text_color='red',pad=20,tooltip='列表',right_click_menu=['&菜单',['粘贴','剪切','复制']],visible=True,auto_size_text=True)]]
window=sg.Window('列表',layout,size=(800,600))
while True:event, values =window.read()if event == None:breakif event == '-LIST-':print(values)window.close()

7.6 列表更新方法

import PySimpleGUI as sglist1=['甲','乙','丙','丁','戊']
list2=['子','丑','寅','卯','辰']layout=[[sg.LB(list1,key='-list-',size=(30,2))],[sg.B('天干'),sg.B('地支')],[sg.B('set_to_index'),sg.B('scroll_to_index')]]window=sg.Window('演示窗口',layout)while True:event, values =window.read()print(event)if event == None:breakif event == '天干':window['-list-'].update(values=list1)if event == '地支':window['-list-'].update(values=list2)if event == 'set_to_index':window['-list-'].update(set_to_index=0)print(window['-list-'].get())if event == 'scroll_to_index':window['-list-'].update(scroll_to_index=3)print(window['-list-'].get())window.close()

7.7 单_多选框属性设定更新

import PySimpleGUI as sg
import get_keys_by_value
list=['非常满意','满意','一般','不满意']layout=[[sg.Text('请对这位男士做出评价(单选框)')],[sg.R(i,group_id=1,key=i)for i in list],[sg.Text('请对这位男士做出评价(多选框)')],[sg.CB(i,key=i)for i in list],[sg.B('确认提交')]]window=sg.Window('演示界面',layout)while True:event, values = window.read()if event == None:breakif event == '确认提交':for k,v in values.items():if v == True:print(k)
window.close()

7.8 单行输入框登录界面

import PySimpleGUI as sg
import 菜单
User1={'用户名':'lisi','密码':'123'}
User2={'用户名':'zhangsan','密码':'345'}
UserList=[User1,User2]
layout = [[sg.Text('账号:'),sg.Input('请输入您的账号',key='-Account-',size=(30,None),#宽、高disabled=False,#元素禁用,True时无法输入任何值password_char=None, #密码字符justification='l',#对齐方式background_color='white',#输入框颜色text_color='green',font=('楷体',12),tooltip=None,#悬浮文本border_width=5,#边框界线宽度enable_events=True,#True输入值会发生一个事件do_not_clear=True,#True输入框内容不会被清除,False时发生事件输入会清除focus=True,#设定焦点,若为True,则光标显示在此输入框pad=None,disabled_readonly_background_color='black',#禁用时背景颜色disabled_readonly_text_color='red',#禁用时文本颜色right_click_menu=None,visible=True)],[sg.T('密码:'),sg.InputText(key='-Password-',size=(30,None),disabled=None,tooltip='3位密码',password_char='*',justification='l',background_color='white',text_color='green',font=('楷体',12),border_width=5,#边框界线宽度focus=False,)],[sg.B('确定'),sg.B('取消')],[sg.T('',key='-Text-',size=(30,None))]]window = sg.Window('Python GUI',layout)
while True:event, values = window.read()if event == None:breakif event == '-Account-':print('-Account-')if event == '确定':for user in UserList:if values['-Account-']==user['用户名'] and values['-Password-']==user['密码']:msg='输入正确'sg.popup(msg)window.close()菜单.Gui()else:msg='输入有误'sg.popup(msg)breakwindow.close()

7.9 单选框

import PySimpleGUI as sglista=['非常满意','满意','一般','不满意']
listb=['请对这位先生做出评价:','请对这位女士做出评价:']# layout=[
#     [sg.T('1.'+listb[0])],
#     [sg.R(i,group_id=1)for i in lista],
#     [sg.T('2.'+listb[1])],
#     [sg.R(i,group_id=2)for i in lista]
# ]# layout=(
#         [[sg.T('1.'+listb[0])]]
#         +
#         [[sg.R(i,group_id=1,key='-R1-')]for i in lista]#纵向的单选框[ [sg.R()]  for i in list]
#         +
#         [[sg.T('2.'+listb[1])]]
#         +
#         [[sg.R(i,group_id=2,key='-R2-')for i in lista]]
#         +
#         [[sg.B('确认',enable_events=True)]]
#         +
#         [[sg.T('',key='-Text-')]]
# )
layout=[[sg.T(str(y+1))]+[sg.R(x,group_id=y,key=(x,y)) for x in lista] for y in range(9)]
window=sg.Window('演示',layout)
while True:event, values =window.read()if event == None:breakif event == '确认':if values['-R1-'] and values['-R2-'] != None:window['-Text-'].update('感谢您的评价')else: window['-Text-'].update('请填写完整')window.close()

7.10 图片元素

import PySimpleGUI as sgimg =r'D:\ph\ph'
base64_gif=sg.DEFAULT_BASE64_LOADING_GIF
layout = [[[sg.Image(filename=img+f'{i}.png')]for i in range(1,4)],[sg.Image(data=base64_gif,key='-GIF-')]]window = sg.Window('演示',layout)
while True:event, values =window.read(timeout=10)window['-GIF-'].update_animation(source=base64_gif,time_between_frames=110)if event ==None:breakwindow.close()

7.11 图片转编码

import base64
f = open(r"C:\\Users\Administrator\Pictures\视频项目\cat.jpg","rb")
res = f.read()
s = base64.b64encode(res)
print(s)
f.close()

7.12 多行文本框

import PySimpleGUI as sgtext = """
春江潮水连海平,海上明月共潮生。
艳艳随波千万里,何处春江无月明。
江流宛转绕芳甸,月照花林皆似霰。
空里留霜不觉飞,汀上白沙看不见。
江天一色无纤尘,皎皎空中孤月轮。
江畔何人初见月,江月何年初照人。
人生代代无穷已,江月年年望相似。
"""
layout = [[sg.ML(default_text=text,key='-TEXT-',disabled=False,border_width=None,size=(50,6),background_color='white',text_color='black',font=('楷体',20),enable_events=True,write_only=False,#当True时,只提供写入,窗口不读取,无返回值reroute_stdout=True,#print语句会显示在此文本框内reroute_cprint=True,#使用cprint将内容打印到此文本框内reroute_stderr=False,#捕捉异常时将文本写在此元素内,sys.stderr.write('?')autoscroll=False,#如果为True,更多数据添加到末尾时元素的内容将自动滚动focus=False,tooltip='作者:张若虚',justification='center',right_click_menu=['菜单',['复制','粘贴','剪切','全选']],visible=True,do_not_clear=True#False窗口读取一次,内容清除)],[sg.In(key='-INPUT1-'),#垂直分割线sg.VerticalSeparator(color='red',key='-VERTICAL-',pad=((10,10),(10,10))),#间隔((左,右),(上,下))sg.B('CPrint',key='-OUTPUT1-')],[sg.In(key='-INPUT2-'),sg.VerticalSeparator(color='red'),sg.B('Print',key='-OUTPUT2-')],[sg.B('更新',key='-UPDATE-')]]window = sg.Window('Window Title', layout)
while True:event, values = window.read()if event ==None:breakif event == '-OUTPUT1-':sg.cprint(values['-INPUT1-'],end=None,sep='',#分割符text_color='black',background_color='Light green',justification='right')window['-INPUT1-'].update('')if event == '-OUTPUT2-':window['-TEXT-'].print(values['-INPUT2-'],end=None,sep='--',  # 分割符text_color='black',background_color='Light blue',justification='left')window['-INPUT2-'].update('')if event == '-UPDATE-':window['-TEXT-'].update(value='你好!',disabled=None,append=True,font=None,text_color=None,background_color=None,justification='left',visible=True,autoscroll=True)
window.close()

7.13 弹窗

import PySimpleGUI as sg
a=sg.popup('弹窗\n'*5,title='演示',button_color=('red', 'green'),background_color='black',auto_close=True,#自动关闭弹窗auto_close_duration=3,#自动关闭弹窗持续时间custom_text=('yes','no'),#自定义按钮文本non_blocking=False,#非阻塞设定,如果为True,立即执行下一步,不需要等待用户的输入,font=('Arial'),no_titlebar=False,#不显示标题栏grab_anywhere=True,# location=(600,700),any_key_closes=True,#True敲打任意键就会关闭界面image=r'C:\Users\风车小牛马\Pictures\icons\1.png',modal=True)print(a)

7.14 弹窗之PopupGetText

import PySimpleGUI as sg
pwd = '123'
list = ['资料1','资料2','资料3','资料4']
while True:result = sg.PopupGetText('密码输入框')if pwd ==result :breakelif result ==None:exit()else:sg.popup('密码错误')
layoutb=[[sg.LB(list,size=(30,5))]]
layout=[[sg.Frame('资料库',layoutb)]]window=sg.Window('演示',layout)
while True:event, values = window.read()if event == None:breakwindow.close()
"""
sg.PopupGetFile()#文件选择弹窗
sg.PopupGetFolder()#文件夹选择
sg.PopupAnnoying()#没有标题栏可随意移动
sg.PopupAutoClose()#显示一段时间自动关闭
sg.PopupCancel()
sg.PopupOKCancel()
sg.PopupOK()
sg.PopupError()
sg.PopupNoButtons()
"""

7.15 按键元素设定

import PySimpleGUI as sgimage_file =r'..//image/1.png'
layout = [[sg.Text('用户名',size=8,background_color='white',text_color='black'),sg.Input(key='-user-')],[sg.Text('密码',size=8,background_color='white',text_color='black'),sg.Input(key='-pwd-')],[sg.Column([[sg.Button(image_filename=image_file,key='-python-',image_size=(32,32),button_color='white',bind_return_key=True,auto_size_button=True)]],justification='center')]]#按钮居中对齐
window = sg.Window('Python练习',layout,keep_on_top=True,background_color='white')while True:event, values =window.read()print(event)if event ==None:breakif event =='-python-':print(event)window.close()

7.16 文件选择器和另存为

import PySimpleGUI as sglayout = [[sg.FilesBrowse(button_text="选择文件",target='-IN1-',#目标元素file_types=(('ALL Files','*.*'),),#选择文件类型initial_folder=r'C:\Users\风车小牛马\Pictures\icons'),#默认跳转路径sg.In(key='-IN1-')],[sg.FolderBrowse(button_text="选择文件夹",target='-IN2-'),sg.In(key='-IN2-')],[sg.SaveAs(button_text="另存为",target='-IN3-'),sg.In(key='-IN3-')]]window = sg.Window('文件选择器',layout)
while True:event, values = window.read()if event ==None:breakwindow.close()

7.17 文本元素

import PySimpleGUI as sgtext = '''
《逢雪宿芙蓉山主人》
——唐代·刘长卿
日暮苍山远,
天寒白屋贫。
柴门闻犬吠,
风雪夜归人。
'''
layout = [[sg.T(text,key='-text-',#元素唯一标识符,用于元素定位size=(None,None),#元素宽高(int,int)font=('楷体',20),#字体auto_size_text=True,#当值设为True时,窗口自动适应文本大小enable_events=True,#bool:事件属性,设定为True时,点击文本发生事件relief='ridge',#浮雕设计‘raised’,'sunken','flat','ridge','solid','groove'border_width=30,#设定relief时,用来设定边界宽度text_color='blue',#文本颜色background_color='white',#背景颜色justification='center',#对齐方式pad=None,#元素间隔right_click_menu=['&Edit',['&Copy','&Paste','&Undo','&More',['&Setting','&About']]],#右键调出菜单grab=False,#设为True时点击移动tooltip='这是一个标识文本',visible=True#显示窗口)]]window = sg.Window('文本元素',layout)while True:event, values = window.read()if event ==None:breakif event == '-text-':sg.Popup('运行了一个点击事件')window.close()

7.18 文本元素更新

import PySimpleGUI as sglayout = [[sg.Text('Hypocrite',key='-Text-'),sg.Button('点赞')]]window = sg.Window('Python',layout)while True:event, values =window.read()print(event)if event == None:breakif event == '点赞':window['-Text-'].update(value='Hello World!',background_color='white',text_color='black',font=('楷体',20),visible=True)
window.close()

7.19 标签

import PySimpleGUI as sglista=['苹果','香蕉','橘子','橙子']
listb=['白菜','芥菜','包菜','生菜']tab1_layout=[[sg.LB(lista,size=(20,10))]]
tab2_layout=[[sg.LB(listb,size=(20,10))]]
layout=[[sg.TabGroup([[sg.Tab('水果类',tab1_layout,title_color='red'),sg.Tab('蔬菜类',tab2_layout)]],tab_location='lefttop',title_color='black',#未选中tab_background_color='gray',selected_title_color='blue',#选中background_color='gray',#标签标题所在空白区域的背景颜色selected_background_color='white',#选中font=('楷体',12),enable_events=False,border_width=10)]]
window=sg.Window('标签演示',layout,keep_on_top=True,background_color='gray')
while True:event, values = window.read()if event == None:breakwindow.close()

7.20 框架元素

import PySimpleGUI as sg
list = ['资料1','资料2','资料3','资料4']
layouta=[[sg.Text('账号'),sg.Input()],[sg.Text('账号'),sg.Input()],[sg.Col([[sg.B('登录')]],justification='center')]]
layoutb=[[sg.LB(list,size=(30,5))]]
layout=[[sg.Frame('登录项',layouta,title_color='green',background_color=None,title_location='n',#12种[东南西北]relief="groove",key='-a-',visible=True),sg.Frame('资料库',layoutb,visible=False,key='-b-')]]
window=sg.Window('框架',layout)
while True:event, values = window.read()if event == None:breakif event =='登录':window['-a-'].update(visible=False)window['-b-'].update(visible=True)window.close()

7.21 滑块

import PySimpleGUI as sgflag=0
layout = [[sg.T('酸性',size=(33,None),justification='left',text_color='red'),sg.T('中性',size=(69,None),justification='center',text_color='white'),sg.T('碱性',size=(33,None),justification='right',text_color='blue')],[sg.Slider(range=(0,14),#数值范围key='-SD-',#键值default_value=7,#起始默认值resolution=0.1,#每次移动间隔tick_interval=True,#标识orientation='horizontal',#方向disable_number_display=False,#是否显示滑块旁数值border_width=5,#relief='raised',#样式size=(100,20),#大小font=('Arial',12,'bold'),#字体background_color='Light blue',#背景颜色text_color='red',#文本颜色tooltip=None,#悬浮文本visible=True#可见状态
)],[sg.Column([[sg.B('上调',size=(10,2)),sg.B('下调',size=(10,2))]], justification='center')],[sg.Column([[sg.B('确认'),sg.B('重置')]],justification='center')],[sg.T('',key='-TEXT-',justification='center',size=110,font=('楷书'))]]window = sg.Window('演示',layout)while True:event, values = window.read()if event == None:breakif event == '确认':if values['-SD-'] > 7.0:print('PH:',values['-SD-'],'碱性')window['-TEXT-'].update('ph:'+str(values['-SD-'])+' 碱性')if values['-SD-'] < 7.0:print('PH:',values['-SD-'],'酸性')window['-TEXT-'].update('ph:' + str(values['-SD-']) + ' 酸性')elif values['-SD-'] == 7.0:print('PH:',values['-SD-'],'中性')window['-TEXT-'].update('ph:' + str(values['-SD-']) + ' 中性')if event == '重置':window['-SD-'].update(value=7.0)if event =='上调':flag=values['-SD-']flag=flag+0.1window['-SD-'].update(value=flag)if event =='下调':flag=values['-SD-']flag=flag-0.1window['-SD-'].update(value=flag)window.close()

7.22 红绿灯

import threading
import time
import PySimpleGUI as sgdef update_button(window, key, color):window[key].update(button_color=('black', color))def traffic_light_controller(window):while True:update_button(window, '-G-', 'green')update_button(window, '-Y-', 'gray')update_button(window, '-R-', 'gray')for seconds in range(30, 0, -1):window['-TIMER-'].update(seconds)time.sleep(1)update_button(window, '-G-', 'gray')update_button(window, '-Y-', 'yellow')update_button(window, '-R-', 'gray')window['-TIMER-'].update('')time.sleep(5)update_button(window, '-G-', 'gray')update_button(window, '-Y-', 'gray')update_button(window, '-R-', 'red')for seconds in range(30, 0, -1):window['-TIMER-'].update(seconds)time.sleep(1)layout = [[sg.Text('计时器:', size=(15, 1)), sg.Text('', size=(5, 1), key='-TIMER-')],[sg.B(button_text='绿灯', button_color=('black', 'gray'), size=(20, 10), key='-G-')],[sg.B(button_text='黄灯', button_color=('black', 'gray'), size=(20, 10), key='-Y-')],[sg.B(button_text='红灯', button_color=('black', 'gray'), size=(20, 10), key='-R-')]
]window = sg.Window('交通信号灯', layout, finalize=True)# 创建并启动线程
controller_thread = threading.Thread(target=traffic_light_controller, args=(window,), daemon=True)
controller_thread.start()while True:event, values = window.read(timeout=1000)  # Timeout in milliseconds, 1000ms = 1 secondif event == sg.WINDOW_CLOSED:break# 关闭窗口
window.close()

7.23 菜单

import PySimpleGUI as sg
def Gui():menu_def = [['File(&F)', ['New', 'Open', '!Save', 'Exit', ]],['Edit', ['Cut', 'Copy::CP', 'Paste', 'Undo'], ],['Help', 'About...'], ]right_menu = [['&File', ['&New', '']]]layout = [[sg.Menu(menu_def)],[sg.Multiline("", key='-IN-',expand_x=True, expand_y=True)],[sg.Multiline("", key='-OUT-',expand_x=True, expand_y=True)],[sg.Text("", key='-TXT-',expand_x=True, font=("Arial Bold", 14))],]window = sg.Window("Menu", layout, size=(715, 300))while True:event, values = window.read()print(event, values)if event != sg.WIN_CLOSED:window['-TXT-'].update(values[0] + "Menu Button Clicked")if event == 'Copy::CP':txt = window['-IN-'].get()if event == 'Paste':window['-OUT-'].update(value=txt)if event == sg.WIN_CLOSED:breakwindow.close()
Gui()

7.24 表格

import PySimpleGUI as sg
a=['编号','商品','价格','','','','']
b=[['001','牛奶','5'],['002','苹果','6'],['003','香烟','10']]
layout=[[sg.Table(b,#表格内容headings=a,#表格头部max_col_width=500,#所有列最大宽度auto_size_columns=False,#是否自动适应列宽度def_col_width=10,#定义列表宽度display_row_numbers=True,#是否显示序号列justification='c',#对齐方式num_rows=15,#定义行数row_height=30,key='-a-',font=('黑体',10),text_color='black',background_color='Light blue',enable_events=True,bind_return_key=True)]]window=sg.Window('表格',layout)
while True:event, values = window.read()if event ==None:breakwindow.close()

7.25 计算器

import PySimpleGUI as sg
def button(text):return sg.B(text,size=(5,3),font=('黑体',18),button_color='black')layout = [[sg.ML(size=(15,2), key='-IN-',font=('黑体',28))],[sg.T('结果',font=('黑体',12)),sg.In(key='-OUT-',size=(13,1),font=('黑体',28))],[button(i) for i in ['AC','(',')','%']],[button(i) for i in '123+'],[button(i) for i in '456-'],[button(i) for i in '789×'],[button(i) for i in '0.=÷'],]window = sg.Window('计算器',layout)
x=None
y=Nonewhile True:event, values = window.read()if event ==None:breakif event in list('1234567890+-().'):window['-IN-'].update(values['-IN-']+event)if event == '%':try:a=eval(values['-IN-']+'*0.01')window['-IN-'].update(values['-IN-'] + '*0.01')except:window['-IN-'].update('')sg.popup('输入有误')if event == '×':window['-IN-'].update(values['-IN-'] + '*')if event == '÷':window['-IN-'].update(values['-IN-'] + '/')if event == 'AC':window['-IN-'].update('')window['-OUT-'].update('')if event == '=':try:window['-OUT-'].update(eval(values['-IN-']))except Exception as e:sg.popup('请输入合法的表达式')print('错误报告:',e)window.close()

7.26 设定模板主题

import PySimpleGUI as sgprint(sg.theme_list())
sg.theme('DarkRed')
sg.Popup('弹窗演示')
# print(sg.theme_button_color())
sg.theme_button_color(('black', '#ad1d45'))
sg.Popup('演示弹窗','按键字体变黑色')

7.27 调用字典

import PySimpleGUI as sgdict ={'河南':'郑州','河北':'石家庄','浙江':'杭州','湖北':'武汉'}
list = []
for i in dict:list.append(i)
layout = [[sg.LB(list,key='-DICT-',size=(40,3),enable_events=True)],[sg.T('行政中心'),sg.Input(key='-INPUT-',size=(30))]]
window = sg.Window('演示',layout)while True:event, values =window.read()if event == None:breakif event == '-DICT-':window['-INPUT-'].update(dict[values['-DICT-'][0]])window.close()

7.28 选择菜单和旋转按钮

import PySimpleGUI as sglist = ['Python', 'Java', 'C++', 'JavaScript', 'php']
layout = [[sg.Text('OptionMenu'),sg.OptionMenu(list,key='-OM-'),sg.Text('Spin'),sg.Spin(list,size=(10,1),key='-SP-',enable_events=True)],[sg.Text('语言'),sg.In(key='-IN-',size=(25))]]window = sg.Window('演示界面',layout)
while True:event, values =window.read()if event ==None:breakif event == '-OM-' or event =='-SP-':window['-IN-'].update(values['-SP-'])
window.close()

7.29颜色选择器和日历选择

import PySimpleGUI as sgmonth =['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月']
week = ['周日','周一','周二','周三','周四','周五','周六']layout = [[sg.ColorChooserButton(button_text='颜色选择器'),sg.In()],[sg.CalendarButton(button_text='日历选择器',close_when_date_chosen=False,# default_date_m_d_y=None,# locale='',format='%Y年%m月%d日',begin_at_sunday_plus=1,month_names=month,day_abbreviations=week,title='日历',no_titlebar=False,location=(700,500),),sg.In()]]window = sg.Window('',layout)
while True:event, values = window.read()if event == None:breakwindow.close()

7.30 PDF合并工具

import PySimpleGUI as sg
import os
from PyPDF2 import PdfFileReader, PdfFileWriter, PdfWriter, PdfReaderdef FileNameGet(filedir):files_list = [os.path.join(root,filepath) \for root, dirs, files in os.walk(filedir) \for filepath in files\if str(filepath).endswith('pdf')]return files_list if files_list else[]def PDFMerge(filepath,output_file):output = PdfWriter()output_pages = 0pdf_file_name = FileNameGet(filepath)if pdf_file_name:for pdf_file in pdf_file_name:sg.cprint("路径:%s" % pdf_file)#读取源PDF文件input=PdfReader(open(pdf_file,"rb"))#获得源PDF文件中页面页数page_count = len(input.pages)output_pages += page_countsg.cprint("页数:%d" % page_count)#分别将page添加到输出output中for iPage in range(page_count):output.add_page(input.pages[iPage])sg.cprint("合并后的总页数:%d." % output_pages)output_stream = open(os.path.join(filepath,output_file),"wb")try:output.write(output_stream)output_stream.close()except Exception as e:sg.cprint("合并失败,请重试")sg.cprint("PDF文件合并完成!")sg.cprint(f"合并后的文件路径:{filepath}/{output_file}",)else:sg.cprint("没有可以合并的PDF文件")
#GUI
def main():layout = [[sg.Text('选择文件夹:',size=(15,1)),sg.In(size=(40,1),key='-file_dir-'),sg.FolderBrowse()],[sg.Text('输入合并后的文件名:',size=(15,1)),sg.In(size=(40,1),key='-out_file-'),sg.B('开始合并')],[sg.ML(size=(70,15),reroute_cprint=True)]]window = sg.Window('PDF合并工具',layout)while True:event, values = window.read()file_dir = values['-file_dir-']out_file = values['-out_file-']if event ==None:breakif event == '开始合并':PDFMerge(file_dir,out_file)window.close()
main()

8 资源链接

PySimpleGUI 官方文档

PySimpleGUI GitHub

作者:TheHypocrite

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/741404.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

忆 2015 硅谷之行

2015 硅谷之行 ,是我脑海里一段充满海蓝色的记忆。 有点像刘姥姥进大观园,也有点像进入另外一个我不曾幻想过的世界。 郊区很美 我们住在郊区,人很少,景色很美。每次去吃饭,还得驱车 15 分钟左右去附近最近的餐厅。Google 总部 Google 对于每个程序员来讲,都是一个梦幻的…

py并发编程

并发编程(并发,并行,同步,异步) 通俗理解并发编程中的相关核心概念 核心概念:进程、线程CPU的作用计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。 CPU的核数(多核计算机多个CPU,大部分情况下也只是用了一核CPU)假定工厂的电力有限,一次只…

Android studio导出apk文件

在Android studio中打开项目 选择build——》 build bundle(s)/apk(s)——》build apk(s) 加载完成后点击右下角弹窗的local(或者在  项目地址\app\build\outputs\apk\debug  中找到apk文件) 将apk文件复制到对应设备上就可以啦(最好别用qq)

JDK、JRE、JVM

JDK:Java Development Kit JRE: Java Runtime Environment JVM: Java Virtual Machine

[CINTA] 具体数论与代数阅读笔记——第一章 整数和二进制(含加、乘、除)

这里是王立斌老师的《具体数论与代数》(CINTA)的阅读笔记前言 这本书说自己是计算机专业数学入门之入门,成为读者攻读其他经典著作的垫脚石,但个人以为足矣替换掉本校内不知所云的、抽象的、让学生考完后马上全忘的那些课程。本书的 GitHub 仓库在这里。 该笔记并非单纯的整…

热爱无限

青春不在年华,而在心境;青春不是桃面、丹唇、柔膝,而是深沉的意志、恢弘的想象、炙热的情感,更是生命中无限的热爱。它使你有一台天线,从天上接受着勇气与力量的信号,使你青春永驻。 怀揣着热爱,我投入到无限的学习之中。当我第一次接触信息学竞赛时,就被其中无限的知识…

Franka Robot 错误处理

使用 FCI 时,您会遇到多种错误,这些错误可能是由于用户发送的不合规命令、通信问题或机器人行为而导致的。以下小节详细介绍了最相关的错误。有关完整列表,请查看 API文档。请注意,发生错误后,您可以自动清除错误并继续使用该franka::Robot::automaticErrorRecovery()命令…

Mybatis Plus 3.X版本的insert填充自增id的IdType.ID_WORKER策略源码分析

总结/朱季谦 某天同事突然问我,你知道Mybatis Plus的insert方法,插入数据后自增id是如何自增的吗? 我愣了一下,脑海里只想到,当在POJO类的id设置一个自增策略后,例如@TableId(value = "id",type = IdType.ID_WORKER)的注解策略时,就能实现在每次数据插入数据库…

共享ip服务器实现外网访问

信息 服务器厂商:炎火云 系统:Windows-2012R2-Datacenter-cn 面板:phpstudy 共享ip服务器实现外网访问思路 通过nat端口映射将内网端口映射到共享ip(即公网ip)端口,实现使用共享ip+端口访问服务器 步骤 首先确定好服务器端口 我这里用的是默认的80端口接着要在防火墙里面…

MySQL-18.主从复制

C-18.主从复制 1.主从复制概述1.1 如何提升数据库并发能力 在实际工作中,我们常常将Redis作为缓存与MySQL配合来使用,当有请求的时候,首先会从缓存中进行查找,如果存在就直接取出。如果不存在再方法数据库,这样就提升了读取的效率,也减少了对后端数据库的访问压力。Redis…

Jetbrains IDE (IntelliJ) 启用原生Wayland支持

启用最新jbr 打开你要设置的IDE,ctrl+shift+a 后输入“runtine”,回车,在显示的窗口中选择jbr21的最新版本,如图所示:设置jvm参数 确认后,点击窗口右下角的小齿轮(如果已经打开了任何项目,先关掉),选择“Edit Custom VM Options“,在出现的文本框最后面加上这么一行:…

30、Django-项目部署-nginx

原理: 安装: 配置: - 这里uwsgi_pass 表示使用uwsgi协议转发代理 - include 表示加载uwsgi协议的参数(固定) - nginx -t   #检查配置文件语法修改uWSGI:socket 表示启用uwsgi协议 本文来自博客园,作者:little小新,转载请注明原文链接:https://www.cnblogs.com/li…