如何同时通过计时器或指定按键终止pynput键盘监听器
问题根因
你原有代码无法触发超时终止的核心原因有两个:
on_press回调中直接return False,会导致监听器在第一次收到任意按键事件后就直接停止运行,完全不会触发后续的超时检测逻辑- 超时条件触发后,你没有主动调用监听器的停止方法,只是退出了while循环,
l.join()会一直等待监听器自身退出,导致程序卡停
修正后的可运行代码
from pynput import keyboard as kb from time import time, sleep exit_script = False def action_press(key): global exit_script if key == kb.Key.end: print('end pressed') exit_script = True # 移除return False,保证监听器可以持续监听按键事件 timeOn = 10 t0 = time() with kb.Listener(on_press=action_press, suppress=True) as l: while not exit_script and time() - t0 < timeOn: # 加短休眠避免空跑循环占用过高CPU sleep(0.1) # 满足退出条件后主动停止监听器 l.stop() print('listener terminated')
替代实现方案(基于Timer定时器)
你也可以用线程定时器实现,不需要手写循环检测时间,代码更简洁:
from pynput import keyboard as kb import threading def action_press(key): if key == kb.Key.end: print('end pressed') listener.stop() timeOn = 10 # 初始化定时器,计时到后自动停止监听器 timer = threading.Timer(timeOn, lambda: listener.stop()) listener = kb.Listener(on_press=action_press, suppress=True) with listener: timer.start() listener.join() # 提前按End键退出的话要取消定时器,避免线程残留 timer.cancel() print('listener terminated')
内容的提问来源于stack exchange,提问作者jf_vt
相关产品推荐
相关产品推荐

