Python使用pynput实现按键启停连点功能无法停止循环的问题
问题原因
- 第一个监听器启动后调用了
join()方法会阻塞主线程,第二个用于监听F4的监听器根本不会被初始化运行 - F3触发的回调函数内部写了死循环,直接占满了监听器的回调线程,就算F4按键事件被捕获也没有空闲线程可以执行暂停逻辑
修复方案
合并两个监听逻辑到同一个回调函数中,将连点逻辑放到独立的子线程运行,避免阻塞监听器的事件响应:
from pynput.keyboard import Controller, Listener import time import threading keyboard = Controller() confirm = False # 独立的连点执行线程 def press_e_loop(): while confirm: keyboard.press('e') keyboard.release('e') time.sleep(0.10) def on_press(key): global confirm key_str = str(key) if "f3" in key_str and not confirm: confirm = True # 子线程运行连点逻辑,不阻塞监听器回调 threading.Thread(target=press_e_loop, daemon=True).start() elif "f4" in key_str: confirm = False with Listener(on_press=on_press) as listener: listener.join()
修改说明
- 移除冗余的第二个监听器,所有按键判断统一在同一个回调内处理,避免串行阻塞问题
- 把原本阻塞回调的while循环迁移到独立的守护子线程中执行,监听器的回调线程始终处于空闲状态,可以正常响应新的按键事件
- 新增启动状态判断,避免重复按F3启动多个连点线程
内容的提问来源于stack exchange,提问作者NewUser
相关产品推荐
相关产品推荐

