如何实现按下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按键监听,避免主程序阻塞影响检测:
- 导入
threading模块,添加全局状态变量和监听函数:
import threading running = True def listen_for_esc(): global running keyboard.wait('esc') running = False print("程序已终止") close() exit()
- 在主程序启动前启动监听线程:
# 启动守护线程,主程序退出时自动终止 threading.Thread(target=listen_for_esc, daemon=True).start() webbrowser.open("example.com") time.sleep(0.2) links() close()
- 修改
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
相关产品推荐
相关产品推荐

