如何在Python脚本等待用户输入时用ESC键立即终止无限循环?
问题
需要在Python脚本运行时,在等待用户输入的环节捕获ESC按键以终止无限while循环,要求只需按下ESC键就能立即中断,而非长按。当前使用keyboard库的代码需要长按ESC才能终止,操作体验不佳,如何实现?
原代码:
import time ; import keyboard as kb while (True): if kb.is_pressed('esc'): break n = str(input('f(x) = ')) print(n) time.sleep(1)
解决方案
原代码的核心问题是input()会阻塞程序执行,只有当用户完成输入并回车后,程序才会回到kb.is_pressed()的判断逻辑,因此必须长按ESC直到循环回到判断点才能触发终止。要实现单次按下ESC立即终止,需要改用非阻塞的按键监听结合非阻塞输入或异常捕获的方式。
方案1:热键回调 + 异常捕获
通过keyboard.add_hotkey注册ESC的单次触发回调,设置终止标志,同时捕获输入中断的异常来退出循环:
import time import keyboard as kb stop_flag = False def on_esc_trigger(): global stop_flag stop_flag = True print("\n已触发ESC,循环终止") # 注册ESC热键,按下一次即触发回调 kb.add_hotkey('esc', on_esc_trigger) while not stop_flag: try: n = input('f(x) = ') print(n) time.sleep(1) except EOFError: # 捕获ESC触发的输入中断异常,直接退出 break # 清理注册的热键 kb.unhook_all()
方案2:非阻塞输入 + 定时检查标志
使用select模块实现非阻塞输入,让循环定期检查终止标志,无需等待用户完成输入:
import time import keyboard as kb import sys import select stop_flag = False def on_esc_trigger(): global stop_flag stop_flag = True print("\n已触发ESC,循环终止") kb.add_hotkey('esc', on_esc_trigger) while not stop_flag: # 检查是否有输入,超时0.1秒,避免过度占用CPU ready, _, _ = select.select([sys.stdin], [], [], 0.1) if ready: n = sys.stdin.readline().strip() print(n) time.sleep(0.1) kb.unhook_all()
关键说明
keyboard.add_hotkey会监听按键的单次按下事件,无需长按,触发后立即修改终止标志。- 方案1保留了
input()的原生交互体验,按下ESC后回车即可终止;方案2完全非阻塞,按下ESC后下一次循环检查就会终止,无需额外操作。
内容的提问来源于stack exchange,提问作者Brandhorst Beaumont
相关产品推荐
相关产品推荐

