You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python文本编写程序中ESC与S键监听异常问题求助

Python文本编写程序中ESC与S键监听异常问题求助

嗨,作为刚入门Python的新手,能写出这样的文本输入程序逻辑已经很不错啦!我仔细看了你的代码和遇到的问题,这两个都是新手使用keyboard模块时容易踩的坑,我来帮你分析原因并给出解决办法:

你遇到的问题回顾

  • ESC键在输入文本的过程中完全没反应,只有程序刚启动时超快按下才会被识别,平时按ESC只会在输入框里显示^[
  • 按下s触发保存时,文件名输入框直接被跳过,最后文件名字段变成了s

问题原因拆解

  1. ESC键监听失效的本质
    input()是一个阻塞式函数——当程序走到input()这一行时,会完全停下来等待你输入内容并按下回车,这期间循环里的keyboard.is_pressed("esc")根本不会被执行!只有当你按下回车结束输入后,程序才会继续运行到按键检测的代码。而你看到的^[是终端对ESC键的默认转义字符表示,并不是程序识别到了按键。

  2. S键导致输入跳过的原因
    你用while True循环不断检测s按键,当检测到按键时,这个s字符并没有被程序“消费”掉,而是留在了系统的输入缓冲区里。接下来执行input("filename >")时,程序会直接读取缓冲区里的s作为输入,所以看起来像是跳过了输入步骤。

修正后的解决方案

我调整了代码逻辑,解决了这两个问题,同时保留了你原本的核心功能:

import keyboard

no_of_lines = 5
line_count = no_of_lines
lines = ""

# 注册ESC键的全局回调函数,按下ESC就触发
def on_esc_press(event):
    global line_count
    print("\n已触发ESC,结束当前输入")
    line_count = 0

keyboard.on_press_key("esc", on_esc_press)

while line_count > 0:
    print(f"请输入第{no_of_lines - line_count + 1}行(按ESC可提前结束):")
    try:
        line = input()
        lines += line + "\n"
        line_count -= 1
    except:
        pass
    
    if line_count == 0:
        print("已完成预设行数输入")
        try:
            inc_line = int(input("是否需要添加额外行数?输入数字或0跳过::"))
        except ValueError:
            inc_line = 0  
        if inc_line > 0:
            no_of_lines += inc_line
            line_count += inc_line

# 取消所有按键回调,避免影响后续操作
keyboard.unhook_all()

print("按下 'S' 键开始保存文件")
# 用wait等待S键,自动处理按键输入,不会留在缓冲区
keyboard.wait("s")

print("用户触发保存,正在处理...")
filename = input("请输入文件名 >")
path = input("请输入保存路径 >")
# 自动补全路径末尾的斜杠,避免路径和文件名拼接错误
if path and not path.endswith(("/", "\\")):
    path += "/"
with open(f"{path}{filename}","w", encoding="utf-8") as file:
    file.write(lines)
print("文件保存成功!")

关键改进点说明

  • ESC键处理:改用keyboard.on_press_key()注册全局回调,无论程序是否卡在input()等待输入,只要按下ESC就会触发回调修改line_count,下一次循环就会结束输入流程。
  • S键处理:用keyboard.wait("s")替代循环检测,这个函数会阻塞程序直到用户按下s,并且会自动“吃掉”这个按键输入,不会留在缓冲区干扰后续的input()
  • 额外优化:增加了路径自动补全斜杠的逻辑,避免路径和文件名拼接出错;添加了更友好的提示文字;写入文件时指定了encoding="utf-8",避免中文乱码问题。

备注:内容来源于stack exchange,提问作者IllTime00qw

火山引擎 最新活动