Python输入过程中检测ESC按键的实现问题求助
Python输入过程中检测ESC按键的实现问题求助
我来帮你排查下问题所在,你的代码里的核心问题是**input()是阻塞式函数**——它会一直等待用户输入完成并按下回车才会继续执行后续代码。这就导致你放在enteringMessage函数调用之后的msvcrt检测代码,根本没机会在用户输入过程中运行,自然捕获不到ESC按键。
要实现输入过程中实时检测ESC,我们需要替换input(),改用msvcrt来逐个读取按键,这样就能在用户输入的每一步都检查是否按下了ESC。下面是修改后的完整代码:
import msvcrt def get_input_with_esc(prompt): print(prompt, end='', flush=True) # 打印提示,不换行并刷新缓冲区 input_chars = [] while True: if msvcrt.kbhit(): char = msvcrt.getch() # 检测ESC按键(十六进制\x1b) if char == b'\x1b': print() # 换行,优化输出格式 return None # 返回None表示用户按下了ESC # 检测回车键,结束输入 elif char == b'\r': print() return ''.join(input_chars) # 检测退格键,删除最后输入的字符 elif char == b'\x08': if input_chars: input_chars.pop() # 控制台回退并删除字符 print('\b \b', end='', flush=True) # 处理可打印字符 elif 32 <= ord(char) <= 126: input_chars.append(char.decode('utf-8')) print(char.decode('utf-8'), end='', flush=True) def enteringMessage(): while True: user_input = get_input_with_esc('What day is it [1,24] ?\n') # 如果用户按下ESC,直接返回None if user_input is None: return None try: day = int(user_input) assert 1 <= day <= 24 return day except (ValueError, AssertionError): print("Invalid input! Please enter a number between 1 and 24.") aborted = False while not aborted: day = enteringMessage() if day is None: aborted = True print("Operation aborted by user.") break humorOftheDay = 'Why did the snowman bring a scarf? Because his neck was a little "chilly"!' # 示例笑话 print(f"Joke of December {day}: ") print(humorOftheDay)
代码关键点说明:
get_input_with_esc函数:- 用
msvcrt.kbhit()实时检查是否有按键按下 - 逐个读取按键:
- 捕获到
b'\x1b'(ESC)时,返回None表示终止 - 捕获到回车键(
b'\r')时,返回用户输入的内容 - 处理退格键(
b'\x08'),实现控制台的字符删除效果 - 只接受可打印的ASCII字符,避免乱码
- 捕获到
- 用
enteringMessage函数:- 调用新的输入函数,若返回
None则直接返回,触发终止逻辑 - 保留原有的输入验证逻辑(数字范围检查)
- 调用新的输入函数,若返回
- 主循环:
- 检测
enteringMessage的返回值,若为None则标记为已终止
- 检测
这样修改后,你在输入过程中按下ESC,程序会立即终止当前输入并退出循环,完全符合你的需求~
备注:内容来源于stack exchange,提问作者Le Cao Tung Lam
相关产品推荐
相关产品推荐

