如何检测按键,实现耗时函数循环至按键按下后终止?
解决方案:用多线程+队列实现全局按键监听与函数循环控制
核心思路是把按键监听逻辑放到独立的后台线程中,将按键事件存入队列,主线程在每次函数执行完毕后检查队列,判断是否需要终止循环。这样即使函数运行时阻塞主线程,后台线程依然能捕获全局按键。
实现代码(基于keyboard模块)
首先确保安装keyboard模块:
pip install keyboard
import time import queue import threading import keyboard # 创建队列存储按键信号 key_queue = queue.Queue() def long_running_func(): time.sleep(10) print('函数执行完成') def key_listener(): # 全局监听q键,按下后向队列发送终止信号 keyboard.wait('q') key_queue.put('terminate') # 启动后台监听线程(守护线程:主线程结束时自动退出) listener_thread = threading.Thread(target=key_listener, daemon=True) listener_thread.start() running = True while running: long_running_func() # 检查队列是否有终止信号 try: signal = key_queue.get(block=False) if signal == 'terminate': running = False print('收到终止信号,停止循环') except queue.Empty: # 队列无信号,继续执行下一轮函数 pass
代码说明
queue.Queue作为线程间通信的媒介,后台线程捕获按键后向队列存入信号,主线程在函数执行间隙读取信号key_listener线程通过keyboard.wait('q')阻塞等待目标按键,按下后立即向队列发送终止信号,设置为守护线程避免主线程结束后残留线程- 主线程每次执行完长耗时函数后,非阻塞式检查队列,确保不会因为等待信号而阻塞流程
扩展:监听多个按键
如果需要支持多个按键触发不同操作,可以修改监听线程为持续监听模式:
def key_listener(): while True: event = keyboard.read_event() if event.event_type == keyboard.KEY_DOWN: if event.name == 'q': key_queue.put('terminate') break elif event.name == 'p': key_queue.put('pause')
内容的提问来源于stack exchange,提问作者someone
相关产品推荐
相关产品推荐

