在PySimpleGUI调试器中实时监控变量,可以通过调试器窗口的Variables
标签页或弹出式调试窗口(Popout)实现。以下是详细步骤和技巧:
一、核心方法:使用调试器窗口的Variables
标签页
-
启用调试器窗口
在代码中调用sg.show_debugger_window()
,并确保窗口在运行期间保持打开:import PySimpleGUI as sgsg.theme('LightGray1') layout = [[sg.Text('Monitoring Demo'), sg.Button('Exit')]] window = sg.Window('Demo', layout)# 启动调试器窗口(位置可选) sg.show_debugger_window(location=(500, 100))# 示例变量 counter = 0 data_list = [1, 2, 3]while True:event, values = window.read(timeout=200) # 异步读取if event == sg.WIN_CLOSED or event == 'Exit':break# 模拟变量变化counter += 1data_list.append(counter)sg.Print(f'Counter: {counter}, List: {data_list}') # 输出到调试器window.close()
-
在调试器中监控变量
- 运行程序后,调试器窗口会自动弹出。
- 切换到
Variables
标签页,查看当前作用域的所有变量。 - 勾选变量前的复选框,将其加入实时监控列表(未勾选的变量仅显示初始值)。
- 变量值会随程序执行自动更新(每200ms刷新一次,与
read()
的timeout
值同步)。
二、快速检查:使用弹出式调试窗口(Popout)
-
通过快捷键触发
- 程序运行时,按下键盘的
BREAK
键(部分键盘标记为Pause
),弹出简化的调试窗口。 - 窗口显示当前变量的快照(非实时更新,但无需手动勾选变量)。
- 程序运行时,按下键盘的
-
手动调用弹出窗口
在代码中指定位置打开弹出窗口:sg.show_debugger_popout_window(location=(100, 100)) # 自定义位置
三、高级技巧:动态监控与交互
-
在REPL中直接修改变量
- 切换到调试器窗口的
REPL
标签页。 - 输入命令修改变量(例如修改全局变量
counter
):counter = 100 # 立即生效,主程序下一轮循环会使用新值
- 切换到调试器窗口的
-
监控局部变量
- 调试器默认显示全局变量。若需监控局部变量(如函数内的变量),需在函数内调用
sg.show_debugger_window()
,或通过global
关键字将变量提升为全局:def my_function():global local_var # 提升为全局变量local_var = "I'm visible!"sg.show_debugger_window() # 调试器会显示local_var
- 调试器默认显示全局变量。若需监控局部变量(如函数内的变量),需在函数内调用
-
结合
sg.Print()
输出日志
使用sg.Print()
替代print()
,输出内容会同时显示在调试器窗口和主控制台:sg.Print(f'Debug: Counter is now {counter}') # 调试器和控制台均可见
四、常见问题解决
-
变量未显示或未更新
- 原因:未勾选
Variables
标签页中的变量,或read()
未设置timeout
。 - 解决:确保
window.read(timeout=200)
中的timeout
值合理(建议200-500ms),并勾选需监控的变量。
- 原因:未勾选
-
弹出窗口不显示
- 原因:键盘
BREAK
键被禁用,或程序阻塞导致无法响应快捷键。 - 解决:手动调用
sg.show_debugger_popout_window()
,或检查事件循环是否被长时间操作阻塞。
- 原因:键盘
-
性能卡顿
- 原因:
timeout
值过小(如10ms)导致频繁刷新。 - 解决:增大
timeout
值(如500ms),或减少监控的变量数量。
- 原因:
五、完整示例代码
import PySimpleGUI as sgsg.theme('LightGray1')
layout = [[sg.Text('Real-time Variable Monitoring')],[sg.Button('Increment'), sg.Button('Exit')],[sg.Text('Counter:', key='-COUNTER-')],[sg.Listbox([], size=(20, 5), key='-LIST-')]
]window = sg.Window('Demo', layout)
sg.show_debugger_window(location=(500, 100)) # 启动调试器counter = 0
data_list = []while True:event, values = window.read(timeout=200)if event == sg.WIN_CLOSED or event == 'Exit':breakif event == 'Increment':counter += 1data_list.append(f'Item {counter}')window['-COUNTER-'].update(f'Counter: {counter}')window['-LIST-'].update(data_list)sg.Print(f'Updated: Counter={counter}, List={data_list}') # 输出到调试器window.close()
操作流程:
- 运行程序,调试器窗口自动弹出。
- 在
Variables
标签页中勾选counter
和data_list
,实时监控其变化。 - 点击“Increment”按钮,观察调试器中变量值的更新。
- 按
BREAK
键快速查看当前变量快照。
通过以上方法,你可以高效利用PySimpleGUI调试器实时跟踪变量状态,快速定位逻辑错误。