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

如何在Python中用非阻塞函数获取用户输入?msvcrt使用问题求助

关于msvcrt.kbhit()代码异常及print参数高亮问题的解决

我尝试了很多方法来使用msvcrt.kbhit(),但编写的代码始终运行异常。编写的代码如下:

import msvcrt
import time

while True:
    msg = ''
    print("Waiting for your message.\n")
    time.sleep(1)  # I tried with and without this line...  
    if msvcrt.kbhit():
        msg = msvcrt.getch().decode()
        print(msg, end='', flush=True)
        if ord(msg) == 13:  # Client enter 'ENTER'
            break

在代码行print(msg, end='', flush=True)中,end和flush显示为红色,这是怎么回事?(除此之外,代码的其他部分运行正常!当我使用input()时,一切都没问题……)


关于参数高亮变红的原因

end和flush显示红色是编辑器语法检查的提示问题,常见情况有两种:

  1. Python解释器版本不匹配:如果编辑器配置的Python解释器是2.x版本,而你用的是Python 3.x的print()函数写法(带关键字参数),就会触发语法错误提示。确认编辑器的Python解释器配置为你实际运行的3.x版本即可。
  2. 编辑器插件缓存或故障:Python语法检查插件(比如VS Code的Pylance、PyCharm的内置检查器)出现缓存错误,重启编辑器或重新加载插件就能解决。

代码运行异常的优化方案

你的代码运行异常主要是time.sleep(1)导致的输入响应延迟,以及循环内重复打印提示语的问题。可以调整代码如下,提升输入响应速度并优化输出体验:

import msvcrt
import time

print("Waiting for your message (press Enter to exit):")
msg = ''
while True:
    if msvcrt.kbhit():
        char = msvcrt.getch().decode()
        # 处理退格键(ASCII码8)
        if ord(char) == 8:
            if msg:
                msg = msg[:-1]
                # 清除当前行并重新打印输入内容
                print('\r' + ' ' * len(msg) + '\r', end='', flush=True)
        # 处理回车键(ASCII码13)
        elif ord(char) == 13:
            print()
            break
        # 处理普通输入字符
        else:
            msg += char
            print(char, end='', flush=True)
    # 缩短睡眠时长,提升按键响应灵敏度
    time.sleep(0.01)

内容的提问来源于stack exchange,提问作者Sara Daum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 03:44:59