Я пытаюсь настроить прослушиватель мыши в 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
, чтобы он мог проверить, жив ли поток.
Я тестирую is_running
, но обнаружил другую проблему - когда он использует sleep
, он блокирует do_work
и не получает другие клики и не может их пропустить - клики ждут в очереди, пока sleep
не закончат работу и do_work
не выполнят другой sleep
для каждого клика, который было в прошлом. do_work
должен был бы создать поток и назначить глобальную переменную, а позже он может использовать эту переменную, чтобы проверить, работает ли поток (или является ли переменная None
). Вам не нужно пропускать нить в do_work
, вы должны создать нить внутри do_work
do_work
работает sleep
, который блокирует listener
на более длительное время и listener
не может получить другие клики от системы, и не может их пропустить - они ждут, пока sleep
закончит работу, а затем listener
получает эти клики из прошлого и запускает do_work
снова и снова.
Вы должны были бы бежать do_work
в theard. 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()
Я написал что-то подобное (что не сработало) и не знал, что могу сделать это с глобальным. Спасибо!
используйте некоторую переменную, чтобы управлять ею
is_running = True/False