如何同时停止键盘与鼠标监听?及相关代码问题解答
解决pynput中ESC键同时终止鼠标和键盘监听的问题
主问题解决方案
你的代码里,按下ESC仅通过返回False终止了键盘监听器,但鼠标监听器仍在后台运行。要同时终止两者,只需在检测到ESC键时主动调用mouse_listener.stop()即可:
修改后的代码:
from pynput import keyboard from pynput import mouse def on_press(key): if key == keyboard.Key.esc: print("EXIT") # 主动停止鼠标监听器 mouse_listener.stop() return False print(key) def on_click(x, y, button, pressed): print(f"{x} {y}") # 用f-string简化输出格式 mouse_listener = mouse.Listener(on_click=on_click) keyboard_listener = keyboard.Listener(on_press=on_press) keyboard_listener.start() mouse_listener.start() keyboard_listener.join() mouse_listener.join()
按下ESC后,键盘监听器会因返回False停止,同时鼠标监听器被主动调用stop()终止,两个进程都会正常结束。
附加问题解答
1. 点击一次触发两次on_click回调
这是因为mouse.Listener的on_click事件会在鼠标按键按下(pressed=True)和释放(pressed=False)时各触发一次。如果只想记录点击按下的动作,可以通过pressed参数过滤:
def on_click(x, y, button, pressed): if pressed: print(f"{x} {y}")
2. PyCharm高亮on_press=on_press的原因
这是PyCharm静态代码检查的误提示:参数名on_press和你的回调函数名on_press同名,IDE可能误以为你在将函数自身赋值给参数,但这是完全合法的Python语法(关键字参数名与函数名一致是允许的)。
如果想消除这个提示,只需把回调函数名改成不同名称即可,比如:
def on_key_press(key): # 原逻辑不变 if key == keyboard.Key.esc: print("EXIT") mouse_listener.stop() return False print(key) keyboard_listener = keyboard.Listener(on_press=on_key_press)
内容的提问来源于stack exchange,提问作者paradoxarium
相关产品推荐
相关产品推荐

