使用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.
相关产品推荐
相关产品推荐

