msvcrt.getch()每次按键后均检测到空格的技术问题咨询
解决msvcrt.getch()每次按键返回字符+0的问题
嘿,这个问题我太熟悉了——这是Windows下msvcrt.getch()的典型行为!
问题根源
在Windows控制台环境中,msvcrt.getch()会捕获按键按下和释放两个事件:当你按下像'a'这样的普通字符键时,它先返回该字符的ASCII码(也就是97),等你松开按键时,又会返回一个0。这就是为什么你输入aaaaa,会得到97 0 97 0...的重复输出。
另外要提一句,getch()还会处理扩展键(比如方向键、功能键),这类键会先返回0或者0xE0,再返回对应的扫描码,虽然这不是你当前的核心问题,但处理时最好一并考虑进去,避免后续出现其他异常。
修复后的代码
我们可以过滤掉这些无效的0(以及扩展键的前置标识字节),只处理有效的普通字符输入,同时完善退出逻辑:
import msvcrt print("press 'escape' to quit...") text = "" while True: char = msvcrt.getch() char_code = ord(char) # 跳过扩展键的前置字节:0或0xE0,同时读取第二个字节丢弃 if char_code in (0, 0xE0): msvcrt.getch() continue # 按下ESC键(ASCII 27)时退出循环 if char_code == 27: break # 打印字符的ASCII码,并将字节转为字符串存入text print(char_code) text += char.decode('utf-8') print(f"\nYou entered: {text}")
代码解释
- 首先判断返回的字节是否是扩展键的标识(0或0xE0),如果是,就再调用一次
getch()读取第二个字节并跳过,避免干扰普通字符的处理。 - 检测到ESC键时退出循环,满足你“按escape退出”的需求。
- 将
getch()返回的字节对象解码为UTF-8字符串,方便后续处理输入的内容。
现在你再输入aaaaa,就只会得到五次97的输出,不会再出现多余的0了!
内容的提问来源于stack exchange,提问作者Antonio Iorga
相关产品推荐
相关产品推荐

