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

如何实现按下Esc键随时关闭Python程序?解决sleep无响应问题

解决Microsoft积分刷分机器人Esc键无法终止程序的问题

问题根源:time.sleep()是阻塞式调用,执行期间程序会暂停所有事件处理,导致keyboard模块无法检测到Esc按键输入。以下是几种可行的解决方法:

方法一:用keyboard.wait()替代time.sleep()

keyboard.wait()支持设置超时时间,同时监听指定按键,不会完全阻塞程序。修改代码中的time.sleep(3)为:

# 等待3秒或直到按下Esc键
if keyboard.wait('esc', timeout=3):
    print("程序已终止")
    close()
    exit()
  • 若3秒内按下Esc,wait()返回True,触发终止逻辑;
  • 若超时未按键,返回False,程序继续执行。

方法二:分段休眠并轮询按键状态

将长休眠拆分为多个短休眠,每次休眠后检查Esc按键状态,确保程序能及时响应:

# 替换原time.sleep(3)
for _ in range(30):  # 30次×0.1秒=3秒
    if keyboard.is_pressed('esc'):
        print("程序已终止")
        close()
        exit()
    time.sleep(0.1)

方法三:使用线程独立监听按键

通过线程单独处理Esc按键监听,避免主程序阻塞影响检测:

  1. 导入threading模块,添加全局状态变量和监听函数:
import threading

running = True

def listen_for_esc():
    global running
    keyboard.wait('esc')
    running = False
    print("程序已终止")
    close()
    exit()
  1. 在主程序启动前启动监听线程:
# 启动守护线程,主程序退出时自动终止
threading.Thread(target=listen_for_esc, daemon=True).start()

webbrowser.open("example.com")
time.sleep(0.2)     
links()
close()
  1. 修改links()函数的循环条件:
def links():
    while running:  # 用全局变量控制循环
        url = generate()
        webbrowser.open(url)
        webbrowser.open("https://rewards.bing.com/pointsbreakdown")
        requests.get("https://rewards.bing.com/pointsbreakdown")
        time.sleep(3)
        for i in range(2):
            close()

额外优化提示

  • 原代码中while ()是无效循环条件,需改为while True(或方法三中的while running);
  • 终止程序时建议添加sys.exit()确保脚本完全退出,需提前导入sys模块。

内容的提问来源于stack exchange,提问作者Kriansh Pokharel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 09:16:16