Код автоматического кликера не работает (первый проект)

#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 и поток?