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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:17:14