如何使用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
相关产品推荐
相关产品推荐

