如何防止函数从 运行 鼠标单击直到上一个完成

How to prevent a function from running on mouse click until previous completes

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

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 以便它可以测试线程是否处于活动状态。

do_work 运行s 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()