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

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)

代码关键点说明:

  1. get_input_with_esc函数:
    • 用msvcrt.kbhit()实时检查是否有按键按下
    • 逐个读取按键:
      • 捕获到b'\x1b'(ESC)时,返回None表示终止
      • 捕获到回车键(b'\r')时,返回用户输入的内容
      • 处理退格键(b'\x08'),实现控制台的字符删除效果
      • 只接受可打印的ASCII字符,避免乱码
  2. enteringMessage函数:
    • 调用新的输入函数,若返回None则直接返回,触发终止逻辑
    • 保留原有的输入验证逻辑(数字范围检查)
  3. 主循环:
    • 检测enteringMessage的返回值,若为None则标记为已终止

这样修改后,你在输入过程中按下ESC,程序会立即终止当前输入并退出循环,完全符合你的需求~

备注:内容来源于stack exchange,提问作者Le Cao Tung Lam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 17:29:33