Python使用keyboard模块后按键残留至终端输入的问题求解
问题原因
你遇到的问题根源是keyboard模块通过系统全局钩子捕获按键时,不会消费终端的标准输入(stdin)事件,你按下的按键会同时被keyboard和终端输入缓冲区捕获,后续调用input()时就会读取到缓冲区中残留的按键内容。
可行解决方法
方法1:调整keyboard模块使用方式(最推荐)
keyboard的read_key方法支持suppress参数,设置为True后会直接拦截捕获到的按键事件,不会传递给当前终端的输入缓冲区,从根源避免残留,仅需修改一行代码即可生效:
import keyboard from time import sleep def get_key() -> str: """ Get the user-pressed key as a lowercase string. E.g. pressing the spacebar returns 'space'. :return: str - Returns a string representation of the pressed key. """ print(f"Press any key...") while True: # 新增suppress=True参数拦截按键事件不传递给终端 pressed_key: str = str(keyboard.read_key(suppress=True)).lower() if not keyboard.is_pressed(pressed_key): break else: continue return pressed_key def main() -> None: pressed_key: str = get_key() print(f"You have pressed: '{pressed_key}'.") sleep(1) input("Now take other user input: ") if __name__ == "__main__": main()
方法2:Windows下手动清空stdin缓冲区
如果不想修改keyboard的调用逻辑,可以在调用input()前手动清空终端输入缓冲区,sys.stdin.flush()无效是因为该方法仅刷新输出缓冲区,对输入缓冲区无效,Windows下可以用标准库msvcrt实现:
import msvcrt # 其他原有代码不变 def main() -> None: pressed_key: str = get_key() print(f"You have pressed: '{pressed_key}'.") sleep(1) # 调用input前清空所有输入缓冲区残留字符 while msvcrt.kbhit(): msvcrt.getch() input("Now take other user input: ")
方法3:临时切换终端焦点(不推荐)
该方法需要调用Windows API实现窗口焦点切换,操作复杂且会影响用户使用体验,不如前两种方法轻便,一般不建议使用。
内容的提问来源于stack exchange,提问作者GBean
相关产品推荐
相关产品推荐

