在 PySimpleGUI 中,事件的监听主要通过 window.read() 方法结合事件循环实现。以下是详细说明和示例:
1. 基本事件监听流程
PySimpleGUI 的事件监听基于 事件驱动模型,核心步骤如下:
- 创建窗口和控件,为需要监听的控件设置
key和enable_events=True(如输入框、按钮等)。 - 进入事件循环,通过
window.read()获取事件和控件值。 - 判断事件类型(如按钮点击、输入框变化等),执行对应逻辑。
- 关闭窗口(如用户点击关闭按钮)。
示例代码
import PySimpleGUI as sg# 1. 定义布局(设置 key 和 enable_events)
layout = [[sg.Input(key='-INPUT-', enable_events=True)], # 监听输入变化[sg.Button('提交', key='-SUBMIT-')], # 按钮点击默认触发事件[sg.Text('', key='-OUTPUT-')] # 显示结果
]# 2. 创建窗口
window = sg.Window('事件监听示例', layout)# 3. 事件循环
while True:event, values = window.read() # 阻塞,等待用户操作# 4. 判断事件类型if event == sg.WIN_CLOSED: # 关闭窗口事件breakelif event == '-INPUT-': # 输入框内容变化window['-OUTPUT-'].update(f"输入内容: {values['-INPUT-']}")elif event == '-SUBMIT-': # 按钮点击window['-OUTPUT-'].update(f"提交内容: {values['-INPUT-']}")# 5. 关闭窗口
window.close()
2. 不同控件的事件监听
(1) 按钮(Button)
- 默认行为:按钮点击会自动触发事件,无需
enable_events=True。 - 示例:
if event == '-BUTTON_KEY-':print("按钮被点击!")
(2) 输入框(Input)
- 需设置
enable_events=True才能监听输入变化。 - 示例:
layout = [sg.Input(key='-INPUT-', enable_events=True)] if event == '-INPUT-':print(f"输入内容: {values['-INPUT-']}")
(3) 下拉菜单(Combo)
- 监听选项变化:
layout = [sg.Combo(['A', 'B', 'C'], key='-COMBO-', enable_events=True)] if event == '-COMBO-':print(f"选择: {values['-COMBO-']}")
(4) 复选框(Checkbox)
- 监听勾选状态变化:
layout = [sg.Checkbox('同意', key='-CHECK-', enable_events=True)] if event == '-CHECK-':print(f"勾选状态: {values['-CHECK-']}")
(5) 列表框(Listbox)
- 监听选中项变化:
layout = [sg.Listbox(['1', '2', '3'], key='-LIST-', enable_events=True)] if event == '-LIST-':print(f"选中: {values['-LIST-']}")
3. 高级事件监听技巧
(1) 超时监听
window.read(timeout=1000) 可设置超时(毫秒),超时后返回 timeout 事件:
event, values = window.read(timeout=1000)
if event == 'timeout':print("1秒内无操作")
(2) 绑定快捷键
通过 bind_return_key=True 让输入框按回车键触发事件:
sg.Input(key='-INPUT-', enable_events=True, bind_return_key=True)
(3) 自定义事件
通过 window.write_event_value() 手动触发事件:
window.write_event_value('-CUSTOM-', '自定义数据') # 触发自定义事件
if event == '-CUSTOM-':print(f"收到自定义事件: {values[event]}")
4. 完整示例:多控件监听
import PySimpleGUI as sglayout = [[sg.Text("输入框监听:"), sg.Input(key='-INPUT-', enable_events=True)],[sg.Text("下拉菜单:"), sg.Combo(['A', 'B', 'C'], key='-COMBO-', enable_events=True)],[sg.Button('提交'), sg.Button('退出')],[sg.Multiline(key='-LOG-', size=(40, 10))]
]window = sg.Window("多控件监听", layout)while True:event, values = window.read()if event in (sg.WIN_CLOSED, '退出'):breakelif event == '-INPUT-':window['-LOG-'].print(f"输入: {values['-INPUT-']}")elif event == '-COMBO-':window['-LOG-'].print(f"选择: {values['-COMBO-']}")elif event == '提交':window['-LOG-'].print(f"提交内容: {values['-INPUT-']}")window.close()
5. 总结
| 功能 | 方法 |
|---|---|
| 基本监听 | event, values = window.read() + if event == 'key' |
| 控件事件 | 设置 enable_events=True(如输入框、下拉菜单) |
| 按钮监听 | 默认支持,无需额外设置 |
| 超时监听 | window.read(timeout=ms) |
| 自定义事件 | window.write_event_value('-KEY-', data) |
通过合理使用这些方法,可以灵活实现 PySimpleGUI 的事件监听逻辑。