如何在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显示红色是编辑器语法检查的提示问题,常见情况有两种:
- Python解释器版本不匹配:如果编辑器配置的Python解释器是2.x版本,而你用的是Python 3.x的
print()函数写法(带关键字参数),就会触发语法错误提示。确认编辑器的Python解释器配置为你实际运行的3.x版本即可。 - 编辑器插件缓存或故障: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
相关产品推荐
相关产品推荐

