如何通过特定按键终止循环中的plt绘图并继续处理EEG数据?
解决MNE EEG绘图按键退出循环的问题
核心问题修正点
plt.waitforbuttonpress返回值错误:该函数返回布尔值(True表示有按键输入,False表示超时),无法直接判断按键字符,需要通过matplotlib事件系统获取具体按键。- 代码执行顺序错误:你当前是先执行插值再等待按键,正确逻辑应该是先让用户完成绘图交互(标记坏道),等待按键后再执行插值和保存操作。
- 路径字符串问题:Windows路径需使用原始字符串(
r'M:\')或转义双反斜杠('M:\\'),避免转义字符解析异常。 raw.plot交互逻辑:设置block=False后,需手动管理事件循环,确保绘图窗口保持活跃直到用户操作。
修改后的完整代码
import os import pickle import matplotlib.pyplot as plt import mne # 修正路径格式,避免转义问题 root_folder = r'M:\' os.chdir(root_folder) for folder in os.listdir(root_folder): folder_path = os.path.join(root_folder, folder) # 跳过非文件夹项,避免遍历出错 if not os.path.isdir(folder_path): continue for filename in os.listdir(folder_path): file_path = os.path.join(folder_path, filename) # 加载pickle格式的EEG数据 with open(file_path, 'rb') as g: raw = pickle.load(g) # 绘制EEG图,block=False让代码继续执行但保持窗口活跃 fig = raw.plot(duration=10, start=0, n_channels=64, scalings='auto', block=False) # 等待用户按键:按任意键关闭当前图继续循环,按'q'直接退出程序 print("请按任意键关闭当前绘图并继续,按'q'退出程序") while True: # 设置超时时间(300秒),避免无限等待 pressed = plt.waitforbuttonpress(timeout=300) if pressed: # 获取用户按下的具体按键 key = fig.canvas.get_keyboard_focus_manager().last_key_pressed plt.close(fig) # 按q则直接退出所有循环 if key == 'q': exit() break # 根据用户标记的坏道执行插值 raw_interp = raw.interpolate_bads(reset_bads=False) # 生成新文件名并保存插值后的数据 nufilename = filename.split("_HighPassed", maxsplit=1)[0] + "_Interp_Chans.pkl" savepath = os.path.join(root_folder, folder) full_save_path = os.path.join(savepath, nufilename) with open(full_save_path, "wb") as f: pickle.dump(raw_interp, f) # with语句会自动关闭文件,无需手动调用f.close()
关键细节说明
- 按键捕获逻辑:通过
fig.canvas.get_keyboard_focus_manager().last_key_pressed获取具体按键,实现按'q'退出程序的定制需求。 - 事件循环保障:用
while True循环确保用户确实按下按键后再继续,避免超时后直接执行后续代码。 - 路径容错处理:添加
os.path.isdir(folder_path)过滤非文件夹项,避免遍历过程中出现路径错误。 - 资源管理优化:利用
with语句自动管理文件资源,无需手动关闭文件,提升代码安全性。
内容的提问来源于stack exchange,提问作者Andreas Massey
相关产品推荐
相关产品推荐

