如何将循环终止触发从KeyboardInterrupt改为按Enter键?
可以实现,这里给你两种可行方案
方案一:多线程监听输入(跨平台通用)
原来的单线程代码里,time.sleep(1)会阻塞主线程,没法同时监听Enter键输入。用多线程可以让循环和输入监听并行执行:
import time import threading def run_indefinitely(stop_event): while not stop_event.is_set(): print("Running indefinitely...") time.sleep(1) def wait_for_enter(stop_event): # 等待用户按下Enter键 input() # 设置停止标志,通知循环线程退出 stop_event.set() if __name__ == "__main__": stop_event = threading.Event() # 启动循环线程 loop_thread = threading.Thread(target=run_indefinitely, args=(stop_event,)) loop_thread.start() # 启动输入监听线程 input_thread = threading.Thread(target=wait_for_enter, args=(stop_event,)) input_thread.start() # 等待输入线程结束(用户按下Enter) input_thread.join() # 等待循环线程退出 loop_thread.join() print("Loop interrupted by user")
关键说明:
threading.Event()是线程安全的标志位,用来在两个线程间传递停止信号- 循环线程会持续检查
stop_event的状态,一旦被设置就退出循环 - 输入线程在用户按下Enter后立刻设置停止标志,不会阻塞循环的执行
方案二:非阻塞输入(分平台实现)
如果不想用多线程,可以用平台相关的API实现非阻塞输入:
适用于Linux/macOS
import time import sys import select def run_indefinitely(): while True: print("Running indefinitely...") time.sleep(1) # 非阻塞检查是否有输入 if select.select([sys.stdin], [], [], 0)[0]: # 读取输入清除缓冲区 sys.stdin.readline() break if __name__ == "__main__": run_indefinitely() print("Loop interrupted by user")
适用于Windows
import time import msvcrt def run_indefinitely(): while True: print("Running indefinitely...") time.sleep(1) # 检查是否有按键按下 if msvcrt.kbhit(): # 判断是否为Enter键 if msvcrt.getch() == b'\r': break if __name__ == "__main__": run_indefinitely() print("Loop interrupted by user")
内容的提问来源于stack exchange,提问作者DCR
相关产品推荐
相关产品推荐

