如何在激活其他窗口时通过按键随时终止Python运行中的循环
解决方案
问题原因
原代码依赖的
KeyboardInterrupt中断信号仅能在Python进程对应的窗口(你的Jupyter Notebook窗口)处于激活状态时捕获,窗口失焦后按键信号无法传递到Python进程,因此无法中断循环。
实现方案
使用keyboard库实现全局按键监听,配合多线程分离自动按键逻辑和按键监听逻辑,无需激活代码运行窗口即可触发终止。
1. 安装依赖
执行以下命令安装全局键盘监听库:
pip install keyboard
2. 权限说明
该方案需要对应系统权限才能正常捕获全局按键:
- Windows:以管理员身份运行Jupyter Notebook / 代码执行终端
- macOS:在「系统设置-隐私与安全性-辅助功能」中为代码运行的终端/Jupyter应用授权
- Linux:使用sudo权限运行代码
3. 改进后代码
import time import pyautogui import keyboard import threading # 退出事件标记,用于线程间通信 exit_event = threading.Event() def kicker(): while not exit_event.is_set(): # 等待4秒,若期间触发退出信号则直接终止循环,无需等满4秒 if exit_event.wait(4): break pyautogui.press('k') if __name__ == "__main__": # 启动自动按键的后台线程 kicker_thread = threading.Thread(target=kicker, daemon=True) kicker_thread.start() # 注册全局热键,按下q时触发退出,可自定义为其他组合键避免误触 # 例如改为'ctrl+alt+x'可降低误触概率 keyboard.add_hotkey('q', lambda: exit_event.set()) # 阻塞等待退出信号 exit_event.wait() # 清理监听钩子 keyboard.unhook_all() print("程序已成功终止")
4. 自定义调整
如果需要修改终止热键,只需修改keyboard.add_hotkey()的第一个参数即可,支持组合键配置,例如'f12'、'ctrl+shift+k'等。
内容的提问来源于stack exchange,提问作者jmas7
相关产品推荐
相关产品推荐

