如何暂停pynput事件监听器?解决无限循环问题
问题修复方案
你的问题核心是模拟输出的'+'被自身的监听器捕获,触发了无限循环。原有的Pause变量因为设置时机错误,没能挡住模拟按键的事件。下面是修复后的代码,以及关键修改说明:
修复后的代码
import pynput from pynput.keyboard import Key, Listener, Controller keyboardOut = Controller() PressedKeys = [] ReleasedKeys = [] # 新增标记:是否正在模拟按键,用于忽略自身输出的事件 is_simulating = False def on_press(key): global PressedKeys, is_simulating # 如果是模拟的按键,直接跳过处理 if is_simulating: return print("getting pressed") PressedKeys.append(key) def on_release(key): global PressedKeys, ReleasedKeys, is_simulating # 如果是模拟的按键,直接跳过处理 if is_simulating: return if len(PressedKeys) > 0: print("getting released") ReleasedKeys.append(key) test_frame() def test_frame(): global PressedKeys, ReleasedKeys, is_simulating print(PressedKeys) print("send outputs") # 标记开始模拟按键,避免监听器捕获自身输出 is_simulating = True keyboardOut.press('+') keyboardOut.release('+') # 模拟完成后取消标记 is_simulating = False PressedKeys.clear() ReleasedKeys.clear() print("处理完成") # 启动监听器 with Listener( on_press=on_press, on_release=on_release) as listener: listener.join()
关键修改点
- 新增
is_simulating标记:专门用来区分用户真实按键和脚本模拟的按键。当脚本模拟输入时,监听器会直接跳过事件处理,从根源避免循环。 - 移除
Pause变量和time.sleep(1):原Pause的逻辑存在时机错误(设置为True后立刻改回False),无法有效拦截模拟事件;sleep会导致程序卡顿,且对解决循环无帮助,直接移除。 - 监听器事件前置判断:在
on_press和on_release的最开头检查is_simulating,确保模拟的按键完全不进入后续处理逻辑。
这样修改后,用户每按一次真实按键,脚本只会输出一个'+',不会触发无限循环。
内容的提问来源于stack exchange,提问作者Joshua Rains
相关产品推荐
相关产品推荐

