首页 > 解决方案 > 如何防止功能在鼠标单击时运行,直到上一个完成

问题描述

我正在尝试在 Python 中设置一个鼠标侦听器,该侦听器在鼠标单击时运行一个函数,只要该函数尚未运行。

from pynput import mouse

def do_work(x, y, button, pressed):
    print(f"Button pressed. Doing work.")
    time.sleep(3)
    print(f"Finished work.")

# Setup mouse listener.
with mouse.Listener(on_click=do_work) as listener:
    listener.join()

所以在上面的例子中,即使我连续按下鼠标按钮,do_work也只会每三秒运行一次。

感觉就像我应该能够在线程中设置它,但我不知道如何将线程传递给do_work它可以测试线程是否还活着。

标签: pythonmultithreadingmouselistenerpynput

解决方案


do_work运行sleep哪些阻塞listener更长的时间并且listener无法从系统获得其他点击,并且它不能跳过它们 - 他们等到sleep完成工作,然后listener从过去获得这些点击并do_work一次又一次地运行。

你将不得不do_work在里面跑。Listener不应该直接运行,do_work但它应该运行其他功能(即。on_click)并且此功能应该检查点击并do_work在单独的线程中启动或跳过点击。

from pynput import mouse
import time
import threading

# --- functions ---

def do_work(x, y, button, pressed):
    print("Button pressed. Doing work.")
    time.sleep(3)
    print("Finished work.")

def on_click(x, y, button, pressed):
    global job
    
    if pressed:
        if job is None or not job.is_alive():
            job = threading.Thread(target=do_work, args=(x, y, button, pressed))
            job.start()
        #else:
        #    print("skiping this click")
    
# --- main ---

job = None  # default value at start

# Setup mouse listener.
with mouse.Listener(on_click=on_click) as listener:
    # ... other code ...
    listener.join()

推荐阅读