如何在程序运行期间临时禁用键盘输入?
解决程序运行期间忽略输入按键的问题
要解决程序运行期间输入的按键不会在后续输入环节自动填充的问题,你可以通过清空系统输入缓冲区的方式实现,以下是分平台及跨平台的解决方案:
Windows 平台解决方案
调用Windows API清空控制台输入缓冲区:
from time import sleep import ctypes def flush_input(): kernel32 = ctypes.WinDLL('kernel32', use_last_error=True) # 获取标准输入句柄 stdin_handle = kernel32.GetStdHandle(-10) # 清空输入缓冲区 kernel32.FlushConsoleInputBuffer(stdin_handle) sleep(5) # 清空sleep期间输入的所有内容 flush_input() entry = input('Write something: ') print(f'你输入的内容是:{entry}')
Linux/macOS(类Unix)平台解决方案
通过termios模块修改终端属性,读取并丢弃缓冲区中的输入内容:
from time import sleep import sys import termios def flush_input(): stdin_fd = sys.stdin.fileno() # 保存原终端属性 old_term_attr = termios.tcgetattr(stdin_fd) try: # 修改终端为非规范模式,关闭回显和缓冲 new_term_attr = old_term_attr.copy() new_term_attr[3] &= ~(termios.ICANON | termios.ECHO) termios.tcsetattr(stdin_fd, termios.TCSANOW, new_term_attr) # 读取所有缓冲的输入并丢弃 while sys.stdin.read(1): pass finally: # 恢复原终端设置 termios.tcsetattr(stdin_fd, termios.TCSANOW, old_term_attr) sleep(5) flush_input() entry = input('Write something: ') print(f'你输入的内容是:{entry}')
跨平台通用解决方案
自动判断系统类型,调用对应处理逻辑:
from time import sleep import sys import ctypes import termios def flush_input(): if sys.platform.startswith('win'): # Windows平台处理 kernel32 = ctypes.WinDLL('kernel32', use_last_error=True) stdin_handle = kernel32.GetStdHandle(-10) kernel32.FlushConsoleInputBuffer(stdin_handle) else: # 类Unix平台处理 stdin_fd = sys.stdin.fileno() old_term_attr = termios.tcgetattr(stdin_fd) try: new_term_attr = old_term_attr.copy() new_term_attr[3] &= ~(termios.ICANON | termios.ECHO) termios.tcsetattr(stdin_fd, termios.TCSANOW, new_term_attr) while sys.stdin.read(1): pass finally: termios.tcsetattr(stdin_fd, termios.TCSANOW, old_term_attr) # 模拟耗时任务 sleep(5) # 清空之前的输入缓冲区 flush_input() # 接收用户输入 entry = input('Write something: ') print(f'你输入的内容是:{entry}')
原理说明
- Windows平台:通过
FlushConsoleInputBufferAPI直接清空控制台的输入缓冲区,丢弃所有未被读取的输入事件。 - 类Unix平台:暂时修改终端为非规范模式,读取并丢弃缓冲区中所有待处理的输入字符,之后恢复终端原有设置,确保后续输入不受影响。
在多线程场景中,只需在启动输入线程/调用input()函数前执行flush_input()即可清空之前的输入内容,避免自动填充问题。
内容的提问来源于stack exchange,提问作者Daniel Sánche
相关产品推荐
相关产品推荐

