一、第一个界面
# ①导入库
import PySimpleGUI as sg
# ②定义布局,确定行数
layout = [
[sg.Text('请输入您的信息:')], # 文本
[sg.Text('姓名:'), sg.InputText('程序员KissFeng')],
[sg.Text('性别:'), sg.InputText('男')],
[sg.Text('国籍:'), sg.InputText('中国')], # 输出窗口
[sg.Button('确定'), sg.Button('取消')] # 按钮
]
# ③创建窗口
window = sg.Window('Python GUI', layout) # 标签
# ④事件循环
while True:
event, values = window.read() # event接收事件,values接收值
if event == None:
break
# ⑤关闭窗口
window.close()
二、窗口读取返回值-事件
# 窗口关闭事件
import PySimpleGUI as sg
layout = [
[sg.Text('请输入您的信息:')], # 文本
[sg.Text('姓名:', enable_events=True), sg.InputText('程序员KissFeng')],
[sg.Text('性别:'), sg.InputText('男')],
[sg.Text('国籍:'), sg.InputText('中国')], # 输出窗口
[sg.Button('确定'), sg.Button('取消')], # 按钮
[sg.Button('确定111'), sg.Button('222取消')]
]
window = sg.Window('Python GUI', layout) # 标签
while True:
event, values = window.read()
# 窗口关闭事件的两种表达
if event == None:
break
# elif event == '确定':
# sg.Popup('您点击了“确认”按钮')
# elif event == '取消':
# sg.Popup('您点击了“取消”按钮')
if event.startswith('确定'): # 判断是否为确定开头
sg.Popup('执行了确定')
if event.endswith('取消'): # 判断是否为取消结尾
sg.Popup('执行了取消')
if event == '姓名:':
sg.Popup('姓名后启动真实事件,当点击姓名则执行该条代码。')
# if event == sg.WIN_CLOSED
# break
window.close()
三、窗口读取返回值-值
# ①导入库
import PySimpleGUI as sg
# ②定义布局,确定行数
layout = [
[sg.Text('请输入您的信息:')], # 文本
[sg.Text('姓名:'), sg.InputText('程序员KissFeng')],
[sg.Text('性别:'), sg.InputText('男')],
[sg.Text('国籍:'), sg.InputText('中国', key='GUOJI')], # 输出窗口
[sg.Button('确定'), sg.Button('取消')] # 按钮
]
# ③创建窗口
window = sg.Window('Python GUI', layout) # 标签
# ④事件循环
while True:
event, values = window.read() # event接收事件,values接收值
if event == None:
break
if event == '确定':
print(values)
if event == '取消':
print(values['GUOJI'])
# ⑤关闭窗口
window.close()
四、PySimpleGUI主题设置
import PySimpleGUI as sg
# 获取所有主题
# sg.theme_previewer()
# 获取主题名列表
print(sg.theme_list())
# 设定主题,括号中写入主题名
sg.theme('Black')
# 随机设计主题,执行完毕后控制台出现主题名称
sg.theme('')
sg.Popup('演示主题')
五、如何修改主题
import PySimpleGUI as sg
sg.theme('LightBlue2')
sg.Popup('演示弹窗')
print(sg.theme_button_color())
# ('#FFFFFF', '#7186C7')查看按钮的属性
# 输出内容前者是文字的参数,后者是背景的参数
sg.theme_button_color(('Black', '#7186C7'))
sg.Popup('演示弹窗')
六、自定义窗口
import PySimpleGUI as sg
layout = [
# 使用字符串则显示在一行中
[sg.Text(i) for i in 'abcd'],
# 使用列表则每行展示一个输入框
[[sg.InputText(i)] for i in ['a', 'b', 'c', 'd']]
]
window = sg.Window('Python教程', layout)
while True:
event, values = window.read()
if event == None:
break
window.close()
import PySimpleGUI as sg
layout = [
[sg.Text('请输入基本信息')],
[sg.Text('姓名')]+[sg.In()]]+[
[sg.Text('性别')]+[sg.In()]],[
[sg.Text('国籍'), sg.In()],
[sg.B('确认'), sg.B('取消')]
]
window = sg.Window('Python教程', layout)
while True:
event, values = window.read()
if event == None:
break
window.close()
七、文本元素的设定方法
import PySimpleGUI as sg
text = '''
江雪 柳宗元〔唐代〕
千山鸟飞绝,万径人踪灭。
孤舟蓑笠翁,独钓寒江雪。
'''
layout = [[sg.T(text, # sg.Text()缩写为sg.T()
key='-Text-', # 元素唯一标识符,书写规范key='-NMAE-'。用于元素的定位。
size=(None, None), # 元素宽度,行高(int,int)
font=('宋体', 20), # 设定字体的名称,大小,font='宋体',font=('宋体',int)or font=['宋体',int]
auto_size_text=True, # 当设定值为True时,窗口自动适应文本大小
enable_events=True, # bool:事件属性,设定为True时,点击文本发生事件。
relief='solid', # 浮设计'raised'突出,'sunken'下沉,'flat'平坦,'ridge'像突出,'solid'实线边框,'groove'边框下限
border_width=10, # 设定边框宽度
text_color='red', # 改变文本颜色
background_color='white', # 文本背景颜色
justification='center', # 对齐方式
right_click_menu=['菜单名', ['1', '2', '3']], # 右击调出菜单 List[List[Union[List[str],str]]],设定后,右击此元素可以调出菜单
grab=True, # 如果为真,则点击元素可以拖动窗口
visible=True # 若是True则元素可见
)]
]
window = sg.Window('Pysimple杰杰', layout)
while True:
event, values = window.read()
if event == '-Text-':
sg.Popup('触发事件')
if event == None:
break
window.close()
import PySimpleGUI as sg
layout = [
[sg.T('你好'), sg.T('你好'), sg.T('你好')],
[sg.T('你好'), sg.T('你好', pad=((30, 40), (20, 50))), sg.T('你好')], # pad=((左, 右),(上,下)) 若左右相可以不写括号直接写一个元素
[sg.T('你好'), sg.T('你好'), sg.T('你好')]
]
window = sg.Window('Pysimple杰杰', layout)
while True:
event, values = window.read()
if event == '-Text-':
sg.Popup('触发事件')
if event == None:
break
window.close()
八、设定文本元素更新方法
import PySimpleGUI as sg
layout = [
[sg.T('程序员KissFeng', key="KK"), sg.B('点赞')],
[sg.T('程序员KissFeng牛牛牛', key="DD"), sg.B('无敌')]
]
window = sg.Window('Pysimple杰杰', layout)
while True:
event, values = window.read()
if event == None:
break
if event == '点赞':
window['KK'].update(
value='感谢支持',
background_color='white',
text_color='black',
font=('快看世界体', 30),
visible=True
)
window.close()
九、制作一个中英文切换的对话框
import PySimpleGUI as sg
layout = [
[sg.B('中文'), sg.B('English')],
[sg.T('请输入基本信息!', key=0)],
[sg.T('姓名', key=1, size=(10,)), sg.In()],
[sg.T('性别', key=2, size=(10,)), sg.In()],
[sg.T('国籍', key=3, size=(10,)), sg.In()],
[sg.B('确定'), sg.B('取消')]
]
window = sg.Window('Python教程', layout)
while True:
event, values = window.read()
if event == 'English':
window[0].update(value='Please enter basic information!')
window[1].update(value='Name')
window[2].update(value='Sex')
window[3].update(value='Nationality')
if event == '中文':
window[0].update(value='请输入基本信息!')
window[1].update(value='姓名')
window[2].update(value='性别')
window[3].update(value='国籍')
if event == None:
break
window.close()
十、单行输入框元素的设定方法
import PySimpleGUI as sg
layout = [
[sg.T('账号'), sg.In('请输入您的账号',
key= 'KissFeng',
size=(30, 10), # 行宽行高
# disabled=True, # bool:元素禁用,,如果为True则禁用,无法输入任何值。
password_char='*', # 密码字符,一般设置为*
justification='c', # 对齐方式,'r','l','c'
# background_color='blue', # 输入框背景颜色
text_color='blue', # 输入框文本颜色
font=('宋体', 20), # 输入字体或者大小
tooltip='这是一个悬浮文本', # 悬浮文本
border_width=5, # 输入框边框边界线的宽度
do_not_clear=True, # bool :输入框内容不被消除
# 如果为False,一发生事件,该输入框内的值会被消除,
focus=True, # 光标在首地址闪烁
pad=(10, 10), # 元素间隔
disabled_readonly_background_color='black', # 元素禁用时使用该背景颜色
disabled_readonly_text_color='red', # 元素禁用时文本颜色的设定
right_click_menu=['你好', ['李宇博', '杰哥']],
visible=True # 元素可见状态的设定
)],
[sg.T('密码'), sg.In('请输入您的密码')],
[sg.B('确认'), sg.B('取消')]
]
window = sg.Window('小杰杰', layout)
while True:
event, velues = window.read()
if event == None:
break
window.close()
十一、单行元素输入框元素的更新
import PySimpleGUI as sg
import sys
import time
class StudentManage():
# 保存学生信息,学号作为key,信息内容作为value
def __init__(self):
# 初始化内容存有数据
self.students = {
'1': {'姓名': '小李', '性别': '男', '年龄': 18},
'2': {'姓名': '小王', '性别': '女', '年龄': 19}
}
# print(self.students)
# 菜单函数(方便弹出菜单,在程序启动函数中每次循环调用到)
def show_Menu(self):
print('-' * 94)
print('【1.所有学生信息】【2.查找学生】【3.添加学生】【4.修改学生信息】【5.删除学生】【6.将学生信息写入文件】【0.退出系统】')
print('-' * 94)
# 启动函数
def start(self):
print('欢迎来到学生信息管理系统'.center(94, '-'))
accounts = set()
while True:
print('【1.登录】【2.注册】【3.退出】'.center(94, '-'))
num = input('请输入您的选项:')
f1 = open('manage.txt', 'r')
con = eval(f1.read())
f1.close()
if num == '1':
user = input('请输入管理员账号:')
password = input('请输入管理员密码:')
for i in range(len(con)):
if user in con[i] and password == con[i][user]:
print('登录成功'.center(40, '-'))
self.select()
elif user in con[i] and password != con[i][user]:
print('登录失败,密码错误'.center(40, '-'))
elif num == '2':
register_user = input('请输入您注册的账号:')
register_password = input('请输入您注册账号的密码:')
print('注册成功'.center(40, '-'))
con.append({register_user: register_password})
f1 = open('manage.txt', 'w')
f1.write(str(con))
f1.close()
# print(accounts)
elif num == '3':
sys.exit('退出程序成功'.center(40, '-'))
else:
print('请输入正确指令'.center(40, '-'))
# 选择功能函数
def select(self):
while True:
self.show_Menu()
# 选择功能(使用字典省去累赘的if语句)
select_fun = {'1': self.show_AllStu,
'2': self.Sel_Search,
'3': self.add_Stu,
'4': self.modify_Stu,
'5': self.del_Stu,
'6': self.write_Stu,
'0': self.exit}
select_id = input("请输入序号选择相应的功能:")
if select_id not in select_fun.keys():
print('输入内容有误,请重新输入有效数字!'.center(40, '-'))
continue
select_fun[select_id]()
# 添加学生信息
def add_Stu(self):
while True:
stu_num = input('请输入学号:')
try:
# 使用异常,判断是否输入学号能转换为整型,若不能转换为整型,输出expect结果
n = int(stu_num)
if stu_num not in self.students:
stu_name = input('请输入姓名:')
stu_sex = input('请输入性别:')
if stu_sex not in ['男', '女']:
print('输入性别格式有误'.center(40, '-'))
continue
try:
stu_age = int(input('请输入年龄:'))
except:
print('输入年龄格式有误'.center(40, '-'))
continue
# 添加学生信息
self.students[stu_num] = {'姓名': stu_name, '性别': stu_sex, '年龄': stu_age}
print('添加成功'.center(40, '*'))
break
else:
print('该学生已存在,请重新输入!'.center(40, '-'))
except:
print('输入数据类型有误,请输入数字学号'.center(40, '-'))
# 输出单条学生信息(仅输出信息,设置该函数为了在输出单个和多个信息时方便调用)
def print_Stu(self, stu_num):
for i in self.students:
if i == stu_num:
print(f'{i: <8s}\t{self.students[i]["姓名"]: <10s}{self.students[i]["性别"]: <10s}{self.students[i]["年龄"]: ^3d}')
# 显示学生信息(套用输出格式进行输出)
def show_Stu(self, stu_num):
print(f"{'学号': <10s}{'姓名': <10s}{'性别': <10s}{'年龄': <10s}")
self.print_Stu(stu_num)
# 显示全部学生信息
def show_AllStu(self):
print(f"{'学号': <10s}{'姓名': <10s}{'性别': <10s}{'年龄': <10s}")
for k in self.students:
self.print_Stu(k)
print('显示所有学生信息完毕'.center(40, '-'))
# 判断查询学生信息的条件
def Sel_Search(self):
print('【1.根据学号查询】【2.根据姓名查询】')
while True:
num = input('请根据需求输入相应序号:')
if num == '1':
self.showStu_id()
break
elif num == '2':
self.showStu_name()
break
else:
print('输入内容有误,请重新输入')
# 根据学号查找学生信息
def showStu_id(self):
stu_num = input('请输入学号:')
try:
n = int(stu_num)
for k in self.students:
if k == stu_num:
self.show_Stu(k)
if stu_num not in self.students:
print('查无此人'.center(30, '-'))
except:
print('输入数据类型有误,请输入数字学号'.center(40, '-'))
# 根据姓名显示学生信息(支持模糊查找)
def showStu_name(self):
name = input('请输入您要查找的学生姓名:(支持模糊查找)')
count = 0
# 用计数的方法判断是否模糊搜索无结果
for i in self.students:
if name in self.students[i]['姓名']:
count += 1
if count != 0:
print('学号', '姓名', '性别', '年龄', sep='\t\t\t')
for i in self.students:
if name in self.students[i]['姓名']:
self.print_Stu(i)
else:
print('查无此人'.center(40, '-'))
# 修改学生信息
def modify_Stu(self):
# 先判断是否为字符数字
stu_num = input('请输入学号:')
try:
n = int(stu_num)
if stu_num in self.students:
self.show_Stu(stu_num)
while True:
name = input('请输入修改后姓名:')
self.students[stu_num]["姓名"] = name
sex = input('请输入修改后性别:')
if sex not in ['男', '女']:
print('输入性别格式有误'.center(40, '-'))
continue
self.students[stu_num]["性别"] = sex
try:
age = int(input('请输入年龄:'))
except:
print('输入年龄格式有误'.center(40, '-'))
continue
self.students[stu_num]["年龄"] = age
break
print('修改完毕'.center(40, '-'))
else:
print('查无此人'.center(40, '-'))
except:
print('输入数据类型有误,请输入数字学号'.center(40, '-'))
# 删除学生信息
def del_Stu(self):
num_list = input('请输入您要删除的学生学号(若批量删除,请用逗号隔开):')
for i in num_list.split(","):
if i in self.students:
self.show_Stu(i)
self.students.pop(i)
print('删除成功'.center(40, '-'))
else:
print('查无此人'.center(40, '-'))
# 将学生信息写入文件
def write_Stu(self):
file = open('students.txt', 'w', encoding="utf-8")
for stu in self.students:
file.writelines('学号:' + str(stu) + '\t\t\t'
+ '姓名:' + str(self.students[stu]['姓名']) + '\t\t'
+ '性别:' + str(self.students[stu]['性别']) + '\t\t'
+ '年龄:' + str(self.students[stu]['年龄']) + '\n')
file.close()
print('写入完毕'.center(40, '-'))
# 退出程序
def exit(self):
print('退出程序', end="")
print('.', end="")
time.sleep(1)
print('.', end="")
time.sleep(1)
print('.')
# 正常退出程序输出下方代码
sys.exit('退出完毕'.center(40, '-'))
Stu = StudentManage()
Stu.start()
layout = [
[sg.In('a')],
[sg.In('b')],
[sg.In('c')],
[sg.In('d', key='KK')],
[sg.B('确认')]
]
window = sg.Window('单行输入框元素的更新', layout)
while True:
event, values = window.read()
if event == None:
break
if event == '确认':
# window['KK'].SetFocus() # 光标移动到第四行
window['KK'].SetTooltip('KissFeng') # 用于更新悬浮文本
window['KK'].update(
value='123',
disabled=True,
select=True,
visible=True,
text_color=None,
background_color=None,
move_cursor_to="end" # 更新悬浮文本
)
window.close()
十二、编写登录窗口
import PySimpleGUI as sg
Users = [{'用户名': 'abc', '密码': '123'}, {'用户名': 'def', '密码': '456'}]
layout = [
[sg.T('请输入您的账号密码以登录~')],
[sg.T('账号', size=(8)), sg.In('请输入您的用户名', key='user')],
[sg.T('密码', size=(8)), sg.In('', tooltip='密码为三位数字!', key='password', password_char='*')],
[sg.B('确定'), sg.B('取消')]
]
window = sg.Window('登录窗口', layout)
while True:
event, values = window.read()
if event == None:
break
if event == '确定':
for i in Users:
if values['user'] == i['用户名'] and values['password'] == i['密码']:
msg='输入正确'
else:
msg='输入有误'
sg.Popup(msg)
window.close()
十三、按键元素的设定及更新方法
import PySimpleGUI as sg
layout = [
[sg.B( # '确定',
key='KK', # 元素的唯一识别符
tooltip='这里是悬浮文本', # 悬浮文本
disabled=False, # True元素禁用
# image_filename=f"C:\\Users\\26699\\Desktop\\学雷锋纪念日\\6.png", # 图片路径,支持GIF和PNG格式的图片
image_data=r'iVBORw0KGgoAAAANSUhEUgAAA4QAAAF/CAYAAAARhAfIAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAO3RFWHRDb21tZW50AHhyOmQ6REFGLVFLWW5PVGc6MjAsajo4NjUxMTE0MjU3NTg3OTk4MDAsdDoyNDAzMDExMBwkBDIAAAT6aVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9J2Fkb2JlOm5zOm1ldGEvJz4KICAgICAgICA8cmRmOlJERiB4bWxuczpyZGY9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMnPgoKICAgICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0nJwogICAgICAgIHhtbG5zOmRjPSdodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyc+CiAgICAgICAgPGRjOnRpdGxlPgogICAgICAgIDxyZGY6QWx0PgogICAgICAgIDxyZGY6bGkgeG1sOmxhbmc9J3gtZGVmYXVsdCc+5a2m6Zu36ZSL57qq5b+15pelIC0gNzwvcmRmOmxpPgogICAgICAgIDwvcmRmOkFsdD4KICAgICAgICA8L2RjOnRpdGxlPgogICAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgoKICAgICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0nJwogICAgICAgIHhtbG5zOkF0dHJpYj0naHR0cDovL25zLmF0dHJpYnV0aW9uLmNvbS9hZHMvMS4wLyc+CiAgICAgICAgPEF0dHJpYjpBZHM+CiAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSdSZXNvdXJjZSc+CiAgICAgICAgPEF0dHJpYjpDcmVhdGVkPjIwMjQtMDMtMDE8L0F0dHJpYjpDcmVhdGVkPgogICAgICAgIDxBdHRyaWI6RXh0SWQ+MTBjMTI2YzUtMWNmYS00OGFkLWExNzItNDIyZGRmNzBhNjM5PC9BdHRyaWI6RXh0SWQ+CiAgICAgICAgPEF0dHJpYjpGYklkPjUyNTI2NTkxNDE3OTU4MDwvQXR0cmliOkZiSWQ+CiAgICAgICAgPEF0dHJpYjpUb3VjaFR5cGU+MjwvQXR0cmliOlRvdWNoVHlwZT4KICAgICAgICA8L3JkZjpsaT4KICAgICAgICA8L3JkZjpTZXE+CiAgICAgICAgPC9BdHRyaWI6QWRzPgogICAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgoKICAgICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0nJwogICAgICAgIHhtbG5zOnBkZj0naHR0cDovL25zLmFkb2JlLmNvbS9wZGYvMS4zLyc+CiAgICAgICAgPHBkZjpBdXRob3I+N3d4ZHNjcXR6aEBtYWlsZXJzLmVkdS5wbDwvcGRmOkF1dGhvcj4KICAgICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KCiAgICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9JycKICAgICAgICB4bWxuczp4bXA9J2h0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8nPgogICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+Q2FudmE8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgICAKICAgICAgICA8L3JkZjpSREY+CiAgICAgICAgPC94OnhtcG1ldGE+0TkcKwAAmZxJREFUeJzs3UusnPdZx/Hv839v884778ycORe7SeOYJm6c1HGLEkJcJ6lbStMGmqaUmK4qStUKIXVTuoEF8qKwBIkdQgJBV1RCgkW7aTcVElK7KaqQWokKCUgcX47P/T6Xh8X7zpxxIIVeYjt5fx/p6Jw5Mz4zZyzNnK/+N0NEREREREQaye72AxAREREREZG7Q0EoIiIiIiLSUApCERERERGRhlIQioiIiIiINJSCUEREREREpKEUhCIiIiIiIg2lIBQREREREWkoBaGIiIiIiEhDKQhFREREREQaSkEoIiIiIiLSUApCERERERGRhlIQioiIiIiINJSCUEREREREpKEUhCIiIiIiIg2lIBQREREREWkoBaGIiIiIiEhDKQhFREREREQaSkEoIiIiIiLSUApCERERERGRhlIQioiIiIiINJSCUEREREREpKEUhCIiIiIiIg2lIBQREREREWkoBaGIiIiIiEhDKQhFREREREQaSkEoIiIiIiLSUApCERER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',
# 按钮使用base64图片格式显示,与上者二选其一 获取方法请查看下一篇
# image_size=(100, 200), # 图片大小
image_subsample=2, # 图片大小设定,2→图片变为原来的1/2
border_width=5, # 按键边界线的设定
# size=(10, 100), # 按键尺寸的设定
auto_size_button=True, # True按键大小适应元素文本
disabled_button_color=None, # 元素禁用的时候使用的按钮颜色
font=None, # 文本元素字体和大小的设定
bind_return_key=True, # 绑定回车键,使用回车键也可以触发该事件
focus=True, # 光标移动
pad=(None, None), # 间隔设定
visible=True # 事件发生后,元素是否显示
)]
]
window = sg.Window('按钮教学', layout)
while True:
event, values = window.read()
print(event)
if event == None:
break
window.close()
import base64
f = open(r"C:\\Users\\26699\\Desktop\\学雷锋纪念日\\7.png", "rb")
res = f.read()
s = base64.b64encode(res)
print(s)
f.close()
十四、编写一个红绿灯
import PySimpleGUI as sg
layout = [
[sg.B('绿灯',
key='green',
button_color=('black', 'green'), # 前参数是字体的颜色,后参数是背景的颜色
size=(20, 9)
)],
[sg.B('黄灯',
key='yellow',
button_color=('black', 'yellow'),
size=(20, 9)
)],
[sg.B('红灯',
key='red',
button_color=('black', 'red'),
size=(20, 9)
)]
]
window = sg.Window('红绿灯', layout)
while True:
event, values = window.read()
print(event)
if event == None:
break
if event == 'green':
window['green'].update(button_color=('black', 'green'))
window['yellow'].update(button_color=('black', 'grey'))
window['red'].update(button_color=('black', 'grey'))
if event == 'yellow':
window['green'].update(button_color=('black', 'grey'))
window['yellow'].update(button_color=('black', 'yellow'))
window['red'].update(button_color=('black', 'grey'))
if event == 'red':
window['green'].update(button_color=('black', 'grey'))
window['yellow'].update(button_color=('black', 'grey'))
window['red'].update(button_color=('black', 'red'))
window.close()
十五、列表元素的设定方法
import PySimpleGUI as sg
list_1 = ['python', 'java', 'c++', 'php', 'html']
layout = [
[sg.LB(list_1,
default_values='java', # 默认选中的值或者列表
key='list',
select_mode='multiple', # 选择模式:single单选,更换时点击选择/multiple可以多选,逐一点击选择/browse单选,鼠标按住也可以更换选择/extended可以多选,鼠标按住可以扩展选择
size=(30, 6),
enable_events=True, # 事件属性,如果设定为True元素列表中被选中的会发生事件
no_scrollbar=False, # True时不显示滚动条
)]
]
window = sg.Window('列表元素设定的方法', layout)
while True:
event, values = window.read()
if event == None:
break
window.close()
十六、列表元素的更新方法
import PySimpleGUI as sg
list_1 = ['python', 'java', 'c++', 'php', 'html']
list_2 = ['程序员', '工程师', '清枫', 'KissFeng']
layout = [
[sg.LB(list_1,
key='list',
size=(30, 2)
)],
[sg.B('编程语言'), sg.B('程序员')],
[sg.B('高亮显示')],
[sg.B('显示到第一行')]
]
window = sg.Window('列表元素设定的方法', layout)
while True:
event, values = window.read()
if event == None:
break
if event == '编程语言':
window['list'].update(values=list_1)
if event == '程序员':
window['list'].update(values=list_2)
if event == '高亮显示':
window['list'].update(set_to_index=2)
print(window['list'].get())
if event == '显示到第一行':
window['list'].update(scroll_to_index=2)
window.close()
十七、在窗口读取字典的键和值
import PySimpleGUI as sg
dict_1 = {"程序员": 'python', "KissFeng": 'java', "博哥": 'c++'}
list_1 = []
for i in dict_1:
list_1.append(i)
layout = [
[sg.LB(list_1, key='KK', size=(30, 6), enable_events=True)],
[sg.T('语言'), sg.In(key='YY', size=(25))]
]
window = sg.Window('窗口调用字典的键和值', layout)
while True:
event, values = window.read()
if event == None:
break
if event == 'KK':
window['YY'].update(dict_1[values['KK'][0]]) # values['KK']是个列表,用[0]取出第一个元素
# print(values['KK'])
window.close()
十八、下拉菜单的设定方法
import PySimpleGUI as sg
list_1 = ['python', 'java', 'c++', 'php']
layout = [
[sg.Drop(list_1,
default_value='java', # 默认选中内容
size=(29, 10),
key='KK',
enable_events=True,
)]
]
window = sg.Window('元素下拉菜单', layout)
while True:
event, values = window.read()
# print(event)
if event == None:
break
if event == 'KK':
print(values['KK'])
window.close()
十九、下拉菜单的更新
import PySimpleGUI as sg
dict_1 = {"程序员": 'python', "KissFeng": 'java', "博哥": 'c++'}
list_1 = []
for i in dict_1:
list_1.append(i)
layout = [
[sg.Drop(list_1, key='KK', size=(30, 6), enable_events=True)],
[sg.T('语言'), sg.In(key='IN', size=(26))]
]
window = sg.Window('窗口调用字典的键和值', layout)
while True:
event, values = window.read()
if event == None:
break
if event == 'KK':
print(values['KK'])
window['IN'].update(dict_1[values['KK']])
window.close()
二十、选择菜单和旋转按键
import PySimpleGUI as sg
list_1 = ['python', 'java', 'c++', 'php', 'html']
layout = [
# 选择菜单
[sg.T('OptionMenu'), sg.OptionMenu(list_1, key='OO')],
# 旋转按钮
[sg.T('Spin'), sg.Spin(list_1, key='KK', size=(20), enable_events=True)],
[sg.T('语言'), sg.In(key='YY', size=(25))]
]
window = sg.Window('选择菜单和旋转按钮', layout)
while True:
event, values = window.read()
if event == None:
break
if event == 'KK':
window['YY'].update(values['KK'])
window.close()
二十一、单选框的多种布局方法
import PySimpleGUI as sg
list_1 = ['非常满意', '满意', '一般', '不满意']
list_2 = ['请你对清枫进行评价:', '请你对KissFeng进行评价:']
layout = [
# 左右布局
[sg.T('1.'+list_2[0])],
[sg.R(i, group_id=1)for i in list_1],
# 上下布局
[sg.T('2.'+list_2[1])],
[[sg.R(i, group_id=2)]for i in list_1],
# 快速布局行列坐标布局
[[sg.T(str(y+1)+'.')]+[sg.R(x, group_id=y, key=(x, y))for x in list_1] for y in range(5)]
]
window = sg.Window('单选框', layout)
while True:
event, values = window.read()
if event == None:
break
window.close()
二十二、单选框属性的设定及更新
import PySimpleGUI as sg
list_1 = ['非常满意', '满意', '一般', '不满意']
list_2 = ['请你对清枫进行评价:', '请你对KissFeng进行评价:']
layout = [
# 左右布局
[sg.T('1.'+list_2[0])],
[sg.R(i, group_id=1, key=i)for i in list_1],
[sg.B('确认提交'), sg.B('更新')]
]
window = sg.Window('单选框', layout)
while True:
event, values = window.read()
if event == None:
break
# 获取选项文本内容
if event == '确认提交':
print(values)
for k, v in values.items():
if v == True:
print(k)
# 清除选项内容
window['满意'].reset_group()
# 更新选项为key的内容
if event == '更新':
window['满意'].update(value=True)
window.close()
二十三、复选框的设定及更新
import PySimpleGUI as sg
list_1 = ['非常满意', '满意', '一般', '不满意']
layout = [
# 左右布局
[sg.T('请你对清枫进行评价:')],
[sg.CB(i, key=i)for i in list_1],
[sg.B('提交选项')]
]
window = sg.Window('复选框', layout)
while True:
event, values = window.read()
if event == None:
break
window.close()
二十四、滑块元素的设定方法
import PySimpleGUI as sg
layout = [
[sg.Slider(
range=(100, 300),
key='SS',
default_value=200, # 滑块元素的初始位置
resolution=10, # 滑块值变化的最小单位值
tick_interval=50, # 刻度值标记,每隔多少个设置
orientation='v', # 方向设定 v是竖直默认值,h是水平
disable_number_display=True, # 删除滑块旁边的数字
border_width=10
)]
]
window = sg.Window('滑块元素的设定', layout)
while True:
event, values = window.read()
if event == None:
break
window.close()
二十五、滑块元素的更新
import PySimpleGUI as sg
layout = [
[sg.Slider(
range=(100, 300),
key='SS',
default_value=200, # 滑块元素的初始位置
)],
[sg.B('更新')]
]
window = sg.Window('滑块元素的更新', layout)
while True:
event, values = window.read()
if event == None:
break
if event == '更新':
window['SS'].update(
value=5, # 滑块初始所在位置
range=(100, 1000), # 滑块滑动的范围
disabled=False, # 元素的禁用状态
visible=True # 元素的禁用状态
)
window.close()
二十六、图片元素的多种书写方法
import PySimpleGUI as sg
img = 'C:\\Users\\26699\\Desktop\\2023-2024第二学期\\'
layout = [
# 单个图片
[sg.Image(filename='C:\\Users\\26699\\Desktop\\2023-2024第二学期\\3.png')]
# 横
# [sg.Image(filename=img + f"{i}.png") for i in range(3, 6)],
# 竖
# [[sg.Image(filename=img + f"{i}.png")] for i in range(3, 6)]
]
window = sg.Window('图片元素', layout)
while True:
event, values = window.read()
if event == None:
break
window.close()
二十七、图片元素的设定及更新方法
import PySimpleGUI as sg
import base64
f1 = open('C:\\Users\\26699\\Desktop\\2023-2024第二学期\\R-C.gif', 'rb')
res = f1.read()
s = base64.b64encode(res)
layout = [
[sg.Image(data=s,key='GIF')]
]
window = sg.Window('图片元素', layout)
while True:
event, values = window.read(timeout=10)
window['GIF'].update_animation(source=s, time_between_frames=500) # 设置帧与帧之间的时间间隔
if event == None:
break
window.close()
二十八、列元素的设定及书写方法
import PySimpleGUI as sg
layout_1 = [
[sg.Text('请输入您的姓名:')],
[sg.In(size=(20))],
[sg.Text('请输入您的年龄:')],
[sg.In(size=(20))],
]
layout_2 = [
[sg.In('')]
]
layout = [
[sg.Col(layout_1,
key='CC',
background_color='black',
size=(400, 400),
pad=None,
scrollable=None, # 显示滚动条
vertical_scroll_only=None, # 只显示数值滚动条
right_click_menu=None, # 右击弹出菜单
justification='left', # 列本身对齐方式
element_justification='Center', # 元素左右对齐方式
vertical_alignment='bottom', # 元素垂直对齐方式
grab=True, # 按住拖动窗口
expand_x=None, # 在水平方向上扩充
expand_y=None
),
sg.Col(layout_2)]
]
window = sg.Window('Python GUI', layout)
while True:
event, values = window.read()
if event == None:
break
window.close()
二十九、框架元素的书写及设定方法
import PySimpleGUI as sg
layout_1 = [
[sg.T('账号'), sg.In()],
[sg.T('密码'), sg.In()]
]
layout = [
[sg.Frame(title='登录框', layout=layout_1,
title_color='red', # 登录框标题颜色
background_color=None, # 框架元素背景颜色
title_location='nw', # 标题所处的位置,n上,s下,w左,e右
relief='sunken', # 浮雕设计raised,sunken,flat,groove,ridge,solid
size=(300, 100), # (宽度,高度)
font=None,
pad=None,
border_width=5, # 线条宽度
tooltip='这里是悬浮文本',
right_click_menu=['右击点出菜单', ['1', '2', '3']]
)]
]
window = sg.Window('框架元素', layout)
while True:
event, values = window.read()
if event == None:
break
window.close()
三十、通过框架元素更新实现页面切换
import PySimpleGUI as sg
list_1 = ['资料1', '资料2', '资料3', '资料4']
# 框架1
layout_1 = [
[sg.T('账号'), sg.In()],
[sg.T('密码'), sg.In()],
[sg.B('确定'), sg.B('取消')]
]
# 框架2
layout_2 = [
[sg.LB(list_1, size=(30, 5))]
]
layout = [
[sg.Frame(title='登录框', key='F1', layout=layout_1),
sg.Frame(title='资料库', key='F2', layout=layout_2, visible=False)]
]
window = sg.Window('框架界面切换', layout)
while True:
event, values = window.read()
if event == None:
break
if event == '确定':
window['F1'].update(visible=False)
window['F2'].update(visible=True)
window.close()
三十一、标签元素的设定与更新
import PySimpleGUI as sg
list_1 = ['香蕉', '苹果', '樱桃', '草莓']
list_2 = ['数学', '语文', '英语', '物理']
tab_layout_1 = [[sg.LB(list_1, size=(50, 5))]]
tab_layout_2 = [[sg.LB(list_2, size=(50, 5))]]
layout = [
[sg.TabGroup([[sg.Tab('水果类', tab_layout_1,), sg.Tab('科目类', tab_layout_2,
# 标签的属性
key=None,
background_color='black',
font=None,
pad=None,
disabled=None,
border_width=None,
tooltip=None,
visible=None,
element_justification='center'
)]],
# 整个标签组的属性
key='BB',
tab_location='left', # 标签标愿所处的位置,有效值有12个分别为
# left,right,top,bottom,lefttop,leftbottom,#righttop,rightbottom,bottomleft, bottomright, topleft, topright
title_color='red', # 未选中的标签颜色
tab_background_color=None, # 标签的边界线
background_color=None, # 标签所在空白位置的颜色
enable_events=None,
tooltip=None,
visible=None
)],
[sg.B('更新')]
]
window = sg.Window('标签元素', layout)
while True:
event, values = window.read()
if event == None:
break
if event == '更新':
# 可以更新的属性
window['BB'].update(title=None, disabled=None, visible=None)
window.close()
三十二、编写一个文件选择器
import PySimpleGUI as sg
layout = [
# 若想要选择多个文件,可以使用FilesBrowse打开
[sg.FileBrowse(button_text='选择文件', # 按钮显示的名称
target='NN', # 目标显示位置的key
file_types=(('ALL Files', '*.py'),), # 前一个参数不用管,后一个参数代表筛选文件名和文件后缀
initial_folder=r'D:\Python代码\研发中心课程\12-PySimpleGUI' # 默认打开的路径
)],
[sg.In(key='IN')],
[sg.In(key='NN')]
]
window = sg.Window('', layout)
while True:
event, values = window.read()
if event == None:
break
window.close()
三十三、文件选择器及文件另存为
import PySimpleGUI as sg
layout = [
# 若想要选择多个文件,可以使用FilesBrowse打开
[sg.FileBrowse(button_text='选择文件', target='N1'), sg.In(key='N1')],
[sg.FolderBrowse(button_text='选择文件夹', target='N2'), sg.In(key='N2')],
[sg.FileSaveAs(button_text='另存为', target='N3'), sg.In(key='N3')]
]
window = sg.Window('文件选择器及另存为', layout)
while True:
event, values = window.read()
if event == None:
break
window.close()
三十四、颜色选择器和日历选择器
import PySimpleGUI as sg
layout = [
[sg.ColorChooserButton(button_text='颜色选择器'), sg.In()],
[sg.CalendarButton(button_text='日历选择器',
target='C2',
default_date_m_d_y=(1, 3, 2024), # 默认显示的日期,月,日,年
format="%Y:%M:%D", # 日期显示格式
title='日历',
no_titlebar=False, # 与上一个联用,共同控制标题
location=(500, 100) # 日历出现的位置,与左边界和上边界分别的位置
), sg.In(key='C2')]
]
window = sg.Window('颜色选择器和日历选择器', layout)
while True:
event, values = window.read()
if event == None:
break
window.close()
三十五、关于弹窗的各种设定
import PySimpleGUI as sg
sg.Popup('程序员清枫', '顶呱呱!',
title='弹窗的标题',
text_color='black',
button_color=('red', 'black'), # 弹窗按钮的设定,(文本颜色, 背景颜色)
background_color='white', # 弹窗颜色
auto_close=False, # 若True弹窗自动关闭,与下方需要一起联用
auto_close_duration=3, # 弹窗自动关闭的时间
keep_on_top=True, # 若为True则弹窗保持显示在最前端
any_key_closes=True, # True任意按键即可关闭弹窗
image=None, # 展示图片
custom_text=('yes', 'no'), # 自定义按键上要显示的文本,可以是单个也可以是多个
modal=True # 除非关闭此页面,否则不能执行下面代码
)
三十六、弹窗之PopGetText
import PySimpleGUI as sg
pwd = '123'
while True:
res = sg.PopupGetText('请输入你的密码:')
if res == pwd:
break
elif res == None:
exit()
else:
sg.Popup('输入错误!')
layout = [
[sg.Image(filename='C:\\Users\\26699\\Desktop\\2023-2024第二学期\\3.png')]
]
window = sg.Window('图片展示', layout)
while True:
event, values = window.read()
if event == None:
break
window.close()
三十七、各种不同特征的窗口
import PySimpleGUI as sg
# 文件选择弹窗 读取文件地址 返回值为文件地址
# sg.PopupGetFile('这里是提示内容')
# 文件夹选择弹窗 获取文件夹地址 返回地址
# sg.PopupGetFolder('获取文件夹地址')
# 错误弹窗
sg.PopupError('出错了!')
# 除此之外还有很多类型的窗口
三十八、菜单栏的设定方法
import PySimpleGUI as sg
menu_1 = [
# 设置快捷键 按住ALT+F键就看也打开文件菜单
['文件(&F)', ['新建', '打开', '保存']],
# 在两个二次菜单中添加三段横杠表示分割线
['编辑', ['设置', '颜色', '---', '格式']],
# 若前方加一个感叹号,则为浅灰色,表示无法使用
['帮助', ['!检查更新', '使用指南']]
]
layout = [
[sg.Menu(menu_1)],
[[sg.In()] for i in range(5)]
]
window = sg.Window('菜单演示', layout)
while True:
event, values = window.read()
if event == None:
break
window.close()
三十九、菜单栏可设置属性
import PySimpleGUI as sg
menu_1 = [
['文件', ['新建', '打开::DA', '保存']],
['编辑', ['设置', '颜色', '格式']],
['帮助', ['检查更新', '使用指南']]
]
layout = [
[sg.Menu(menu_1, key='Menu')],
[[sg.In()] for i in range(5)]
]
window = sg.Window('菜单演示', layout)
while True:
event, values = window.read()
if event == None:
break
if event == '打开::DA':
sg.Popup('点击了打开~')
window.close()
四十、window窗口常用属性
import PySimpleGUI as sg
menu_1 = [
['文件', ['新建', '打开', '保存']],
['编辑', ['设置', '颜色', '格式']],
['帮助', ['检查更新', '使用指南']]
]
layout = [
[sg.Menu(menu_1, key='Menu')],
[[sg.In()] for i in range(5)],
[sg.B('确定'), sg.B('取消')]
]
window = sg.Window('菜单演示', layout,
location=(500, 300), # 元素窗口出现的位置
# size=(300, 500), # 窗口的宽高设定
element_padding=(5, 10), # 元素间隔设定
button_color=('red', 'white'), # 按钮的颜色设置(文本颜色, 背景颜色)
font=None,
background_color=None,
grab_anywhere=True, # 任意位置可以移动窗口
resizable=True, # 若为True则界面生成之后可以调整大小
disable_close=False, # 若为True,则关闭不起作用
disable_minimize=False, # 若为True则最小化按钮不起作用
)
while True:
event, values = window.read()
if event == None:
break
window.close()
四十一、多行文本框元素
import PySimpleGUI as sg
text_1 = '''山雨
翁卷〔宋代〕
一夜满林星月白,
亦无云气亦无雷。
平明忽见溪流急,
知是他山落雨来。'''
layout = [
[sg.ML(text_1,
disabled=False, # True则不能输入或者更改内容
border_width=5, # 边界线宽度
size=(50, 10),
background_color=None,
text_color=None,
enable_events=True, # True能够触发文本事件
key='ML',
# write_only=False, # False可以读取到文本中的内容,True读取不到
# reroute_stdout=True, # True将print的内容输出在窗口中
reroute_cprint=True, # 将print内容书写到文本框中
)],
[sg.OK(),
sg.VerticalSeparator(color='red', key=None, pad=None),
sg.Cancel()],
[sg.B('更新')]
]
window = sg.Window('', layout)
while True:
event, values = window.read()
if event == None:
break
if event == 'OK':
print('OK')
window['ML'].print('你好', '我是程序员清枫!')
if event == 'Cancel':
sg.cprint('Cancel', '你点击了Cancel',
end='\t',
sep=';',
text_color=None,
background_color=None,
key=None,
justification=None
)
if event == '更新':
window['ML'].update(
value='你好!!!',
disabled=False, # True元素禁用
append=False, # 为True则是在文本之后添加,而不是重新书写
)
window.close()
四十二、自定义计算器及打包
import PySimpleGUI as sg
def button(text):
return sg.B(text, pad=(2, 2), size=(4, 2), font=('黑体', 18), button_color='black')
layout = [
[sg.T('', key='KK')],
[sg.In('', size=(12, 2), font=('黑体', 28), key='IN')],
[button(i) for i in ['AC', '(', ')', '退格']],
[button(i) for i in ['1', '2', '3', '+']],
[button(i) for i in ['4', '5', '6', '-']],
[button(i) for i in ['7', '8', '9', '×']],
[button(i) for i in ['0', '.', '=', '÷']],
]
window = sg.Window('计算器', layout, resizable=True)
while True:
event, values = window.read()
if event in ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '(', ')', '+', '-', '.']:
window['IN'].update(values['IN'] + event)
if event == '×':
window['IN'].update(values['IN'] + '*')
if event == '÷':
window['IN'].update(values['IN'] + '/')
if event == '退格':
list_1 = list(values['IN'])
list_1.pop(-1)
str_1 = ''.join(list_1)
window['IN'].update(str_1)
if event == '=':
try:
window['KK'].update('')
window['IN'].update(eval(values['IN']))
except Exception as res:
window['IN'].update('')
window['KK'].update(res, text_color='red', font=('黑体', 15))
if event == 'AC':
window['KK'].update('')
window['IN'].update('')
if event == None:
break
window.close()
# 打包方式,在cmd中输入
# python -m pysimplegui-exemaker.pysimplegui-exemaker