You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何同时通过计时器或指定按键终止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 14:18:04