入门版
下面是几个全面展示PySimpleGUI模块用法的示例,并附有详细的代码注释,帮助你更好地掌握该模块的使用。
示例1:简单的输入输出界面
这是一个基础的GUI示例,展示了如何使用文本输入框、按钮和文本输出框。
import PySimpleGUI as sg
# 定义布局
layout = [
[sg.Text("请输入您的名字:")], # 标签组件
[sg.InputText(key="-NAME-")], # 输入框,key用于后续访问输入值
[sg.Button("提交"), sg.Button("退出")], # 按钮
[sg.Text("", size=(40, 1), key="-OUTPUT-")] # 显示输出的文本框
]
# 创建窗口
window = sg.Window("简单输入输出示例", layout)
# 事件循环,处理事件和输入
while True:
event, values = window.read()
if event == sg.WINDOW_CLOSED or event == "退出":
break
if event == "提交":
name = values["-NAME-"] # 获取输入框的值
window["-OUTPUT-"].update(f"你好,{name}!") # 更新输出文本
# 关闭窗口
window.close()
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
示例2:文件选择对话框
这个示例展示了如何使用文件选择对话框,用户可以选择文件并显示其路径。
import PySimpleGUI as sg
# 定义布局
layout = [
[sg.Text("请选择一个文件:")],
[sg.Input(), sg.FileBrowse()], # 文件浏览按钮
[sg.Button("确定"), sg.Button("退出")],
[sg.Text("您选择的文件路径是:", size=(40, 1), key="-OUTPUT-")]
]
# 创建窗口
window = sg.Window("文件选择示例", layout)
# 事件循环
while True:
event, values = window.read()
if event == sg.WINDOW_CLOSED or event == "退出":
break
if event == "确定":
file_path = values[0] # 获取文件路径
window["-OUTPUT-"].update(f"路径: {file_path}")
# 关闭窗口
window.close()
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
示例3:带有进度条的长时间任务
这个示例展示了如何使用进度条来显示任务的进度。
import PySimpleGUI as sg
import time
# 定义布局
layout = [
[sg.Text("任务进行中...")],
[sg.ProgressBar(100, orientation='h', size=(20, 20), key='-PROG-')],
[sg.Button("开始"), sg.Button("退出")]
]
# 创建窗口
window = sg.Window("进度条示例", layout)
# 事件循环
while True:
event, values = window.read()
if event == sg.WINDOW_CLOSED or event == "退出":
break
if event == "开始":
for i in range(100):
time.sleep(0.1) # 模拟长时间任务
window['-PROG-'].update(i + 1) # 更新进度条
# 关闭窗口
window.close()
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
示例4:选项卡布局
这个示例展示了如何创建包含多个选项卡的界面。
import PySimpleGUI as sg
# 定义选项卡内容
tab1_layout = [
[sg.Text("这是第一个选项卡")],
[sg.InputText("输入一些内容", key="-TAB1_INPUT-")]
]
tab2_layout = [
[sg.Text("这是第二个选项卡")],
[sg.Button("点击我", key="-TAB2_BUTTON-")]
]
# 定义选项卡
layout = [
[sg.TabGroup([[sg.Tab("选项卡1", tab1_layout), sg.Tab("选项卡2", tab2_layout)]])],
[sg.Button("确定"), sg.Button("退出")]
]
# 创建窗口
window = sg.Window("选项卡示例", layout)
# 事件循环
while True:
event, values = window.read()
if event == sg.WINDOW_CLOSED or event == "退出":
break
if event == "确定":
sg.popup(f"你在第一个选项卡中输入了: {values['-TAB1_INPUT-']}")
if event == "-TAB2_BUTTON-":
sg.popup("你点击了第二个选项卡中的按钮")
# 关闭窗口
window.close()
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
示例5:下拉菜单与滑块
这个示例展示了如何使用下拉菜单和滑块组件。
import PySimpleGUI as sg
# 定义布局
layout = [
[sg.Text("请选择一个选项:")],
[sg.Combo(['选项1', '选项2', '选项3'], key='-COMBO-')], # 下拉菜单
[sg.Text("选择一个值:")],
[sg.Slider(range=(1, 100), orientation='h', size=(20, 20), key='-SLIDER-')], # 滑块
[sg.Button("确定"), sg.Button("退出")],
[sg.Text("", size=(40, 1), key="-OUTPUT-")]
]
# 创建窗口
window = sg.Window("下拉菜单与滑块示例", layout)
# 事件循环
while True:
event, values = window.read()
if event == sg.WINDOW_CLOSED or event == "退出":
break
if event == "确定":
combo_value = values['-COMBO-']
slider_value = values['-SLIDER-']
window['-OUTPUT-'].update(f"选择了: {combo_value}, 值为: {slider_value}")
# 关闭窗口
window.close()
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
通过这些示例,你可以全面掌握PySimpleGUI的各种基本组件和功能,并能根据需要扩展和应用这些知识。
中等难度
以下是几个中等难度的PySimpleGUI应用示例,涵盖了更复杂的功能和布局设置,帮助你进一步掌握该模块的使用。
示例1:带有子窗口的主窗口
这个示例展示了如何在主窗口中打开和管理子窗口。
import PySimpleGUI as sg
# 主窗口布局
main_layout = [
[sg.Text("主窗口")],
[sg.Button("打开子窗口"), sg.Button("退出")]
]
# 创建主窗口
main_window = sg.Window("主窗口", main_layout)
# 事件循环
while True:
event, values = main_window.read()
if event == sg.WINDOW_CLOSED or event == "退出":
break
if event == "打开子窗口":
# 子窗口布局
sub_layout = [
[sg.Text("这是一个子窗口")],
[sg.InputText("在这里输入一些内容")],
[sg.Button("关闭")]
]
# 创建子窗口
sub_window = sg.Window("子窗口", sub_layout)
# 子窗口事件循环
while True:
sub_event, sub_values = sub_window.read()
if sub_event == sg.WINDOW_CLOSED or sub_event == "关闭":
break
sub_window.close()
# 关闭主窗口
main_window.close()
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
示例2:带有菜单栏的多功能应用
这个示例展示了如何创建一个带有菜单栏的多功能应用,用户可以通过菜单栏选择不同的功能。
import PySimpleGUI as sg
# 定义菜单栏
menu_def = [
['文件', ['打开', '保存', '---', '退出']],
['编辑', ['剪切', '复制', '粘贴']],
['帮助', ['关于']]
]
# 主窗口布局
layout = [
[sg.Menu(menu_def)],
[sg.Text("请选择菜单中的操作")],
[sg.Multiline(size=(40, 10), key='-MULTILINE-')]
]
# 创建窗口
window = sg.Window("菜单栏示例", layout)
# 事件循环
while True:
event, values = window.read()
if event == sg.WINDOW_CLOSED or event == '退出':
break
elif event == '打开':
file_path = sg.popup_get_file('选择一个文件')
if file_path:
with open(file_path, 'r', encoding='utf-8') as file:
window['-MULTILINE-'].update(file.read())
elif event == '保存':
file_path = sg.popup_get_file('保存文件为', save_as=True)
if file_path:
with open(file_path, 'w', encoding='utf-8') as file:
file.write(values['-MULTILINE-'])
elif event == '剪切':
window['-MULTILINE-'].Widget.event_generate("<<Cut>>")
elif event == '复制':
window['-MULTILINE-'].Widget.event_generate("<<Copy>>")
elif event == '粘贴':
window['-MULTILINE-'].Widget.event_generate("<<Paste>>")
elif event == '关于':
sg.popup('这是一个示例应用程序', title='关于')
# 关闭窗口
window.close()
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
示例3:表格显示与数据处理
这个示例展示了如何在PySimpleGUI中使用表格来显示数据,并实现简单的数据处理功能。
import PySimpleGUI as sg
# 表格数据
data = [
["Alice", 25, "Engineer"],
["Bob", 30, "Doctor"],
["Charlie", 35, "Teacher"]
]
# 定义表格头
header = ["Name", "Age", "Profession"]
# 布局
layout = [
[sg.Table(values=data, headings=header, max_col_width=25,
auto_size_columns=True, display_row_numbers=True,
justification='right', num_rows=10, key='-TABLE-')],
[sg.Button("添加行"), sg.Button("删除行"), sg.Button("退出")]
]
# 创建窗口
window = sg.Window("表格示例", layout)
# 事件循环
while True:
event, values = window.read()
if event == sg.WINDOW_CLOSED or event == "退出":
break
elif event == "添加行":
new_data = sg.popup_get_text("输入新行数据,用逗号分隔 (例如:David,40,Lawyer)")
if new_data:
data.append(new_data.split(","))
window['-TABLE-'].update(values=data)
elif event == "删除行":
selected = values['-TABLE-']
if selected:
del data[selected[0]]
window['-TABLE-'].update(values=data)
# 关闭窗口
window.close()
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
示例4:用户登录界面
这个示例展示了如何创建一个简单的用户登录界面,并验证用户名和密码。
import PySimpleGUI as sg
# 模拟用户数据
user_data = {
"user1": "password1",
"user2": "password2"
}
# 登录窗口布局
layout = [
[sg.Text("用户名")],
[sg.Input(key="-USERNAME-")],
[sg.Text("密码")],
[sg.Input(password_char="*", key="-PASSWORD-")],
[sg.Button("登录"), sg.Button("退出")]
]
# 创建窗口
window = sg.Window("用户登录界面", layout)
# 事件循环
while True:
event, values = window.read()
if event == sg.WINDOW_CLOSED or event == "退出":
break
if event == "登录":
username = values["-USERNAME-"]
password = values["-PASSWORD-"]
if username in user_data and user_data[username] == password:
sg.popup("登录成功", title="成功")
else:
sg.popup("用户名或密码错误", title="错误")
# 关闭窗口
window.close()
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
示例5:可调整窗口大小的图像查看器
这个示例展示了如何创建一个可调整窗口大小的图像查看器,用户可以加载并查看图像。
import PySimpleGUI as sg
from PIL import Image
# 布局
layout = [
[sg.Text("图像查看器")],
[sg.Image(key="-IMAGE-")],
[sg.Button("加载图像"), sg.Button("退出")]
]
# 创建窗口
window = sg.Window("图像查看器", layout, resizable=True)
# 事件循环
while True:
event, values = window.read()
if event == sg.WINDOW_CLOSED or event == "退出":
break
elif event == "加载图像":
file_path = sg.popup_get_file("选择图像文件")
if file_path:
# 使用PIL加载并调整图像大小以适应窗口
image = Image.open(file_path)
image.thumbnail((window.size[0] - 20, window.size[1] - 60))
bio = sg.io.BytesIO()
image.save(bio, format="PNG")
window["-IMAGE-"].update(data=bio.getvalue())
# 关闭窗口
window.close()
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
这些中等难度的示例展示了更复杂的布局、事件处理和数据操作,帮助你更深入地了解和应用PySimpleGUI模块。
进阶版
以下是几个复杂的PySimpleGUI应用示例,涵盖更高级的功能,并附有详细注释,帮助你作为初学者进阶学习。
示例1:动态表单生成与数据处理
这个示例展示了如何根据用户选择动态生成表单,并处理用户输入的数据。
import PySimpleGUI as sg
# 初始布局
layout = [
[sg.Text("请选择一个表单类型:")],
[sg.Combo(['个人信息', '地址信息', '支付信息'], key='-FORM_TYPE-', enable_events=True)], # 下拉菜单,enable_events=True允许实时触发事件
[sg.Button("提交"), sg.Button("退出")]
]
# 创建窗口
window = sg.Window("动态表单生成", layout)
# 动态表单组件列表
dynamic_form = []
# 事件循环
while True:
event, values = window.read()
if event == sg.WINDOW_CLOSED or event == "退出":
break
elif event == '-FORM_TYPE-':
form_type = values['-FORM_TYPE-']
# 清除旧的动态表单组件
for element in dynamic_form:
window[element].update(visible=False)
dynamic_form.clear()
# 根据选择的表单类型生成新的表单
if form_type == '个人信息':
dynamic_form = [
sg.Text('姓名:'), sg.Input(key='-NAME-'),
sg.Text('年龄:'), sg.Input(key='-AGE-')
]
elif form_type == '地址信息':
dynamic_form = [
sg.Text('街道:'), sg.Input(key='-STREET-'),
sg.Text('城市:'), sg.Input(key='-CITY-'),
sg.Text('邮编:'), sg.Input(key='-ZIP-')
]
elif form_type == '支付信息':
dynamic_form = [
sg.Text('信用卡号:'), sg.Input(key='-CARD-'),
sg.Text('有效期:'), sg.Input(key='-EXPIRY-'),
sg.Text('CVV:'), sg.Input(key='-CVV-')
]
# 将新生成的表单组件添加到窗口布局
window.extend_layout(window, [[sg.Column([[element] for element in dynamic_form], key='-DYNAMIC_FORM-')]])
elif event == '提交':
sg.popup('表单数据', values)
# 关闭窗口
window.close()
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
示例2:多窗口交互与数据共享
这个示例展示了如何创建多个窗口并在它们之间共享数据。
import PySimpleGUI as sg
# 主窗口布局
layout_main = [
[sg.Text("主窗口")],
[sg.Input("在这里输入", key='-MAIN_INPUT-')],
[sg.Button("打开子窗口"), sg.Button("退出")]
]
# 创建主窗口
main_window = sg.Window("主窗口", layout_main)
# 事件循环
while True:
event, values = main_window.read()
if event == sg.WINDOW_CLOSED or event == "退出":
break
elif event == "打开子窗口":
sub_layout = [
[sg.Text("子窗口")],
[sg.Text(f"从主窗口传递的数据:{values['-MAIN_INPUT-']}")], # 从主窗口获取输入数据并显示
[sg.Input("子窗口输入", key='-SUB_INPUT-')],
[sg.Button("返回主窗口"), sg.Button("关闭子窗口")]
]
sub_window = sg.Window("子窗口", sub_layout, modal=True) # modal=True表示子窗口打开时主窗口不可操作
while True:
sub_event, sub_values = sub_window.read()
if sub_event == sg.WINDOW_CLOSED or sub_event == "关闭子窗口":
break
elif sub_event == "返回主窗口":
main_window['-MAIN_INPUT-'].update(sub_values['-SUB_INPUT-']) # 将子窗口的数据返回主窗口
sub_window.close()
# 关闭主窗口
main_window.close()
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
示例3:复杂的布局管理与事件处理
这个示例展示了如何创建复杂布局,包括多列、多行、多选项卡的界面,并处理不同区域的事件。
import PySimpleGUI as sg
# 选项卡布局
tab1_layout = [
[sg.Text("选项卡1内容")],
[sg.InputText("输入一些内容", key="-TAB1_INPUT-")],
[sg.Button("按钮1", key="-TAB1_BTN-")]
]
tab2_layout = [
[sg.Text("选项卡2内容")],
[sg.Slider(range=(0, 100), orientation='h', size=(20, 20), key='-SLIDER-')],
[sg.Button("按钮2", key="-TAB2_BTN-")]
]
# 主窗口布局
layout = [
[sg.Menu([['文件', ['退出']], ['帮助', ['关于']]])],
[sg.TabGroup([[sg.Tab("选项卡1", tab1_layout), sg.Tab("选项卡2", tab2_layout)]], key="-TABS-")], # TabGroup用于多选项卡布局
[sg.Text("状态栏", size=(40, 1), key="-STATUS-")],
[sg.Button("退出")]
]
# 创建窗口
window = sg.Window("复杂布局示例", layout, finalize=True) # finalize=True确保窗口在显示前已经完全初始化
# 事件循环
while True:
event, values = window.read()
if event == sg.WINDOW_CLOSED or event == "退出":
break
elif event == "关于":
sg.popup("这是一个复杂布局的示例应用程序", title="关于")
elif event == "-TAB1_BTN-":
window['-STATUS-'].update(f"在选项卡1中输入了: {values['-TAB1_INPUT-']}") # 更新状态栏
elif event == "-TAB2_BTN-":
window['-STATUS-'].update(f"在选项卡2中滑动值: {values['-SLIDER-']}")
# 关闭窗口
window.close()
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
示例4:异步任务处理与实时更新
这个示例展示了如何处理异步任务,并实时更新界面。
import PySimpleGUI as sg
import threading
import time
# 任务函数
def long_task(window):
for i in range(10):
time.sleep(1) # 模拟长时间任务
window.write_event_value('-PROGRESS-', i+1) # 将进度传递回主线程
# 主窗口布局
layout = [
[sg.Text("异步任务处理示例")],
[sg.ProgressBar(10, orientation='h', size=(20, 20), key='-PROGRESSBAR-')],
[sg.Button("开始任务"), sg.Button("退出")]
]
# 创建窗口
window = sg.Window("异步任务示例", layout)
# 事件循环
while True:
event, values = window.read()
if event == sg.WINDOW_CLOSED or event == "退出":
break
elif event == "开始任务":
threading.Thread(target=long_task, args=(window,), daemon=True).start() # 启动异步任务
elif event == '-PROGRESS-':
window['-PROGRESSBAR-'].update(values[event]) # 实时更新进度条
# 关闭窗口
window.close()
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
示例5:树形结构展示与操作
这个示例展示了如何创建一个树形结构,并在其中添加、删除节点。
import PySimpleGUI as sg
# 定义树形结构数据
tree_data = sg.TreeData()
tree_data.Insert("", "_A", "节点A", [1, 2, 3]) # 插入根节点A
tree_data.Insert("_A", "_A1", "节点A1", [4, 5, 6]) # 在A下插入子节点A1
tree_data.Insert("", "_B", "节点B", [7, 8, 9]) # 插入根节点B
# 布局
layout = [
[sg.Tree(data=tree_data, headings=["数据"], auto_size_columns=True,
num_rows=10, col0_width=20, key="-TREE-", show_expanded=False)], # show_expanded=False初始时不展开树
[sg.Button("添加节点"), sg.Button("删除节点"), sg.Button("退出")]
]
# 创建窗口
window = sg.Window("树形结构示例", layout)
# 事件循环
while True:
event, values = window.read()
if event == sg.WINDOW_CLOSED or event == "退出":
break
elif event == "添加节点":
selected_node = values["-TREE-"][0] if values["-TREE-"] else "" # 获取选中的节点
new_node_key = sg.popup_get_text("输入新节点名称")
if new_node_key:
tree_data.Insert(selected_node, new_node_key, new_node_key, []) # 插入新节点
window["-TREE-"].update(tree_data)
elif event == "删除节点":
selected_node = values["-TREE-"][0] if values["-TREE-"] else None
if selected_node:
tree_data.Delete(selected_node) # 删除选中的节点
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.