如何防止函数从 运行 鼠标单击直到上一个完成
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()
我正在尝试在 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()