Цикл автокликера выполняется рандомно и некорректно

Я новичок, решил сделать автокликер с двумя условиями: если переменная-переключатель, равна True, и если зажата лкм. А он кликает рандомное количество раз, и перестаёт, до следующего зажатия лкм. А мне нужно что-бы он бесконечно кликал пока зажата лкм. Искал инфу про такие скрипты - ничего конкретного, и я так и не понял как это починить.

import keyboard
import mouse
import time
import threading

active = False


def toggle_variable():
    global active
    active = not active


keyboard.add_hotkey('alt', toggle_variable)


def clicker():
    time.sleep(0.625)
    mouse.click(button='left')


def main():
    while True:
        if active and mouse.is_pressed(button='left'):
            clicker()


clicker_thread = threading.Thread(target=main)
clicker_thread.start()

while True:
    time.sleep(1)
    pass

Я уверен что и конец написан неправильно, но каким бы он не был, цикл работает некорректно.


Ответы (1 шт):

Автор решения: Leteers

Вот пример с простым переключением через альт при желании можно добавить еще какую-либо клавишу:

import keyboard
import mouse
import time

active = False


def toggle_variable():
    global active
    active = not active


keyboard.add_hotkey('alt', toggle_variable)


def main():
    while active:
        print('CLICK')
        time.sleep(0.05)
        mouse.click(button='left')
while True:
    main()

Проблема возникает если необходимо например при зажатой ЛКМ прожимать эту кнопку еще и скриптом, потому что тогда статус зажатия ЛКМ оказывается сбит. Мой совет это поменять ЛКМ на другую клавишу например колесико или правую. А еще луче просто еще одну кнопку на клавиатуре. Код для выполнения действия с нажатием alt и зажатой ЛКМ:

import keyboard
import time
from ctypes import windll

GetAsyncKeyState = windll.user32.GetAsyncKeyState

VM_LBUTTON = 0x01
active = False


def toggle_variable():
    global active
    active = not active


keyboard.add_hotkey('alt', toggle_variable)


def main():
    while GetAsyncKeyState(VM_LBUTTON)!=0 and active:
        print(GetAsyncKeyState(VM_LBUTTON))
        time.sleep(0.05)
        
while True:
    main()
→ Ссылка