You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过特定按键终止循环中的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()

关键细节说明

  1. 按键捕获逻辑:通过fig.canvas.get_keyboard_focus_manager().last_key_pressed获取具体按键,实现按'q'退出程序的定制需求。
  2. 事件循环保障:用while True循环确保用户确实按下按键后再继续,避免超时后直接执行后续代码。
  3. 路径容错处理:添加os.path.isdir(folder_path)过滤非文件夹项,避免遍历过程中出现路径错误。
  4. 资源管理优化:利用with语句自动管理文件资源,无需手动关闭文件,提升代码安全性。

内容的提问来源于stack exchange,提问作者Andreas Massey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 20:46:33