python - 如何防止功能在鼠标单击时运行,直到上一个完成
问题描述
我正在尝试在 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
它可以测试线程是否还活着。
解决方案
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()
推荐阅读
- flutter - 无法从 json 反序列化为自定义对象列表
- laravel-7 - 从上下文调用私有方法 Kreait\Firebase\ServiceAccount::fromArray()
- ios - 核心音频:不推荐使用 AUGraph 时如何通过 MusicPlayer 播放 MIDI MusicSequence?
- java - 制作killcounter minecraft java时出错
- python - 使用 auto-py-to-exe 将 .py 转换为 .exe 时遇到问题
- firebase - Firestore:无效的文档参考。文档引用必须有偶数个段,
- python - 在烧瓶 api 中加载泡菜
- node.js - 如何覆盖 BigQuery 方法调用的默认超时
- python - 加载具有透明背景的图像
- angular - 如何动态地将函数传递给角度forkJoin()?