【PysimpleGUI教程】学生信息管理系统 超级详细 一周速成

一、第一个界面

# ①导入库
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
  • 13
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值