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

如何同时停止键盘与鼠标监听?及相关代码问题解答

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:35:06