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

如何暂停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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:48:45