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

使用pynput单键触发输入时遇无限循环的解决求助

解决pynput自动输入触发无限循环的问题

按下s键时,程序会删除输入的s并自动输出sample,但因为sample包含s字符,监听器会捕捉到程序自身输入的s,进而无限重复触发输出逻辑,最终导致samplsamplsampl...的无限循环。

要实现仅忽略pynput自身输入、不屏蔽物理键盘输入,可以通过添加状态标志区分输入来源:

原问题代码

from pynput.keyboard import Key, Listener, Controller

kb = Controller()


def on_press(key):
    if not 'char' in dir(key):
        return

    if key.char == "s":
        kb.press(Key.backspace) # deletes "s"
        kb.release(Key.backspace)
        kb.type("sample")
        return


def on_release(key):
    if key == Key.esc:
        return False


with Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

修改后的代码

from pynput.keyboard import Key, Listener, Controller

kb = Controller()
# 标志位:标记是否是程序自身在输入
is_program_typing = False


def on_press(key):
    global is_program_typing
    # 如果是程序自身输入,直接跳过处理
    if is_program_typing:
        return
    
    if not hasattr(key, 'char'):
        return

    if key.char == "s":
        is_program_typing = True  # 开启标志,告知后续输入是程序触发的
        kb.press(Key.backspace)
        kb.release(Key.backspace)
        kb.type("sample")
        is_program_typing = False  # 输入完成后关闭标志


def on_release(key):
    if key == Key.esc:
        return False


with Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

原理说明

  • 添加is_program_typing全局变量作为状态标志,程序开始自动输入前将其设为True,输入完成后设为False。
  • 监听器的on_press函数首先检查这个标志:如果是True,说明当前输入是pynput自身触发的,直接跳过处理逻辑;如果是False,则处理物理键盘的输入。

这样就能精准区分物理键盘输入和程序自动输入,避免无限循环的同时,不影响物理键盘的正常使用。

内容的提问来源于stack exchange,提问作者simo.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:35:26