You need to enable JavaScript to run this app. 如何使用pynput实现鼠标按键松开时终止正在运行的函数?
优惠活动
大模型
产品
解决方案
定价
更多

如何使用pynput实现鼠标按键松开时终止正在运行的函数?

修复方案

核心错误点

  • 线程创建逻辑错误:threading.Thread(target=logging_mouse(running,i)) 写法会同步执行logging_mouse函数,执行完成后才会创建线程,完全没有异步运行的效果,是导致事件阻塞的核心原因。
  • 变量作用域错误:logging_mouse函数中使用的是传入的局部running参数,后续修改全局running为False时,函数内的局部变量不会同步更新,循环永远不会触发停止条件。
  • 监听器回调配置错误:初始化Listener时on_release=wasd(1)会直接执行wasd(1)而非传入回调函数,同时on_click的lambda参数传递逻辑和自定义的on_click函数参数不匹配,会触发参数异常。

修复后代码

import threading
from pynput.mouse import Listener

running = False
i = 0
f = 4
delta_x = [1,2,3]
delta_y = [3,2,1]

def wasd(l):
    global f
    f = f + l
    print(f)
    return f == 5

def logging_mouse(start_i):
    global running, i
    i = start_i
    while running and i < len(delta_x):
        print(delta_x[i], delta_y[i])
        if wasd(0):
            break
        i += 1
    running = False

def on_click(x, y, button, pressed):
    global running, f, i
    print(running)
    if pressed:
        if not running:
            running = True
            # 正确创建异步线程:传函数引用,参数通过args字段传递
            threading.Thread(target=logging_mouse, args=(i,)).start()
    else:
        running = False
        wasd(1)
        f = 4
        i = 0

with Listener(on_click=on_click) as listener:
    listener.join()

逻辑说明

修复后按下鼠标按键会异步启动logging_mouse函数运行,监听器不会被阻塞可以正常响应松开事件,松开时修改全局running为False,logging_mouse的循环判断会立即检测到状态变化终止运行,符合需求。

内容的提问来源于stack exchange,提问作者jr123456jr987654321

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 23:06:00