Making an autoclicker in python?

Question:

I have designed this simple autoclicker in python using the pynput library

import time
import threading
from pynput.mouse import Button, Controller
from pynput.keyboard import Listener, KeyCode

TOGGLE_KEY = KeyCode(char="t")
activated = False
mouse = Controller()

def on_press(key):
    global activated
    if key == TOGGLE_KEY:
        activated = not activated

        while activated:
            mouse.click(Button.left, 1)
            time.sleep(0.01)


listner = Listener(on_press=on_press)
listner.start()

input()

This code activates a listner and when the user presses any key it calls the on_press function which checks if the button is equal to ‘t’ then it inverts the property of activated and starts the while loop

I tried the above code and it worked but when I pressed ‘t’ again the autoclicker did not switch off

Asked By: THE_DEV_7861

||

Answers:

I believe you are stuck in your while activated: loop. Pushing T again does not make the function run again unless the first function has stopped. A simple solution would be to put the click event in its own thread.

import time
import threading
from pynput.mouse import Button, Controller
from pynput.keyboard import Listener, KeyCode

TOGGLE_KEY = KeyCode(char="t")
activated = False
mouse = Controller()

def on_press(key):
    global activated
    if key == TOGGLE_KEY:
        activated = not activated

def doClick():
    global activated
    while True:
        if activated:
            mouse.click(Button.left, 1)
            time.sleep(0.01)

threading.Thread(target = doClick).start()

listner = Listener(on_press=on_press)
listner.start()

input()
Answered By: Ando

I think the problem is that the program is stuck in the loop. A solution I found is to use a thread

import threading
import time

from pynput.keyboard import Listener, KeyCode
from pynput.mouse import Controller

mouse = Controller()

class Clicker(threading.Thread):
    __TOGGLE_KEY = KeyCode(char="t")
    __activated = False

    def run(self) -> None:
        super().run()
        while True:
            if self.__activated:
                # mouse.click(Button.left, 1)
                time.sleep(1)
                print("activated")

    def keyboard_listener(self, key) -> None:
        if key == self.__TOGGLE_KEY:
            self.__activated = not self.__activated


clicker = Clicker()
listner = Listener(on_press=clicker.keyboard_listener)
listner.start()
clicker.start()
print("Listener started")

input()
Answered By: mamo
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.