#python #multithreading #time #listener #pynput
#python #многопоточность #время #слушатель #pynput
Вопрос:
Я пытаюсь использовать pynput для создания автокликера в качестве моего первого проекта, но мне трудно понять, почему мой код не будет работать. Код предназначен для запуска / остановки нажатия, когда я нажимаю «ctrl alt i» и нажимаю один раз каждые 1 секунду. Вот мой текущий код. Я не могу понять, почему это не работает, но то, что я сделал до сих пор, так это то, что «click_thread.running» меняется с true на false, python прослушивает мою клавиатуру, и щелчок работает ТОЛЬКО ТОГДА, КОГДА я устанавливаю «self.running» в классе «ClickMouse» наверно. Вывод, который я получаю при печати «click_thread.running», кажется, меняется с true на false, но если это происходит, то почему не запускается щелчок? Я бы предположил, что это как-то связано с тем, что это подкласс «threading.Поток»? Или, может быть, я неправильно определил класс? В любом случае я работаю над этим уже несколько дней, и я чувствую, что наткнулся на стену, пытаясь разобраться в этом в одиночку. Любая помощь с благодарностью!
import time
import threading
from pynput.mouse import Button, Controller
from pynput import keyboard
delay = 1
button = Button.left
class ClickMouse(threading.Thread):
def __init__(self, delay, button):
super().__init__()
self.delay = delay
self.button = button
self.running = False
def run(self):
while self.running == True:
mouse.click(self.button)
time.sleep(self.delay)
def start_clicking(self):
self.running = True
def stop_clicking(self):
self.running = False
mouse = Controller()
click_thread = ClickMouse(delay, button)
click_thread.start()
def on_activate_i():
print('<ctrl> <alt> i pressed')
if click_thread.running == False:
click_thread.start_clicking()
else:
click_thread.stop_clicking()
print(click_thread.running)
with keyboard.GlobalHotKeys({'<ctrl> <alt> i': on_activate_i,}) as h:
h.join()
Ответ №1:
Как только вы вызовете click_thread.start()
, start
обработчик вызовет вашу run
функцию в новом потоке. На данный момент self.running
есть False
. Таким образом, ваш цикл while немедленно завершится, и поток завершится.
Итак, установите running=True
значение по умолчанию и не создавайте поток до тех пор, пока on_activate_i
.
Где вы нажимаете? Наугад?
Комментарии:
1. Я надеялся снова включить и выключить нажатие, когда я запускаю on_activate_i, начиная с off . Поскольку вы не можете запустить поток более одного раза, есть ли способ сохранить цикл while и поток?