Python键盘监听:按下Insert键后循环无法持续运行的问题
问题原因
你的代码逻辑顺序错误导致无法进入循环:
- 初始状态
STATUS为False,主线程进入with块后直接跳过while STATUS:循环,执行listener.join() listener.join()会阻塞主线程,让它一直等待监听线程结束,之后即使按下Insert将STATUS改为True,主线程已经卡在join()里,完全没有机会再回去检查循环条件
修复方案
调整代码结构,让主线程先启动监听线程,再持续检查STATUS状态,避免提前阻塞:
from pynput.keyboard import Listener, Key import time STATUS = False def on_press(key): global STATUS if key == Key.insert: STATUS = True def on_release(key): global STATUS if key == Key.end: STATUS = False # 初始化并启动监听线程 listener = Listener(on_press=on_press, on_release=on_release) listener.start() # 主线程循环检查状态 try: while True: if STATUS: print('on loop') time.sleep(0.1) # 添加sleep避免CPU占用过高 # 可按需添加全局退出条件,比如按下Esc键终止程序 # if 某按键触发: # break finally: listener.stop() listener.join()
补充说明
- 不要在监听回调函数里执行循环:监听回调是在监听线程中运行的,阻塞回调会导致无法处理后续按键(比如按下End键无法修改
STATUS) - 添加
time.sleep(0.1)是为了避免循环空转导致CPU占用过高
内容的提问来源于stack exchange,提问作者Ming
相关产品推荐
相关产品推荐

