Reputation: 31
I can't figure out how to make auto clicks start when I press the left mouse button and stop when I release it. Maybe someone knows how to solve it?
Perhaps with the help of pynput
it is not advisable to do this, but it is better to use pyautogui
, or there are some other solutions.
# importing time and threading
import time
import threading
from pynput.mouse import Button, Controller
# pynput.keyboard is used to watch events of
# keyboard for start and stop of auto-clicker
from pynput.keyboard import Listener, KeyCode
# four variables are created to
# control the auto-clicker
delay = 0.277
button = Button.left
start_stop_key = KeyCode(char='+') #The left mouse button should be here
stop_key = KeyCode(char='-')
# threading.Thread is used
# to control clicks
class ClickMouse(threading.Thread):
# delay and button is passed in class
# to check execution of auto-clicker
def __init__(self, delay, button):
super(ClickMouse, self).__init__()
self.delay = delay
self.button = button
self.running = False
self.program_running = True
def start_clicking(self):
self.running = True
def stop_clicking(self):
self.running = False
def exit(self):
self.stop_clicking()
self.program_running = False
# method to check and run loop until
# it is true another loop will check
# if it is set to true or not,
# for mouse click it set to button
# and delay.
def run(self):
while self.program_running:
while self.running:
mouse.click(self.button)
time.sleep(self.delay)
time.sleep(0.1)
# instance of mouse controller is created
mouse = Controller()
click_thread = ClickMouse(delay, button)
click_thread.start()
# on_press method takes
# key as argument
def on_press(key):
# start_stop_key will stop clicking
# if running flag is set to true
if key == start_stop_key:
if click_thread.running:
click_thread.stop_clicking()
print("click end")
else:
click_thread.start_clicking()
print("click start")
# here exit method is called and when
# key is pressed it terminates auto clicker
elif key == stop_key:
click_thread.exit()
listener.stop()
with Listener(on_press=on_press) as listener:
listener.join()
I searched for a solution but didn't understand anything.
Upvotes: 2
Views: 495
Reputation: 31
I found a solution.
It turned out that using the left mouse button when it is pressed is not the best solution, but rather not working.
You need to use an unoccupied key, in my case it is the middle mouse key. I replaced the function on_press
with the function on_click
, which was presented in the pynput
documentation, but thereby lost the functionality of completing the script on the key.
Here is the code:
# importing time and threading
import time
import threading
from pynput.mouse import Button, Controller
from pynput import mouse
delay = 0.277
button = Button.left
class ClickMouse(threading.Thread):
def __init__(self, delay, button):
super(ClickMouse, self).__init__()
self.delay = delay
self.button = button
self.running = False
self.program_running = True
def start_clicking(self):
self.running = True
def stop_clicking(self):
self.running = False
def exit(self):
self.stop_clicking()
self.program_running = False
def run(self):
while self.program_running:
while self.running:
muse.click(self.button)
time.sleep(self.delay)
time.sleep(0.1)
# instance of mouse controller is created
muse = Controller()
click_thread = ClickMouse(delay, button)
click_thread.start()
def on_click(x, y, button, pressed):
if button == button.middle:
if pressed:
click_thread.start_clicking()
print("click start")
elif not pressed:
click_thread.stop_clicking()
print("click end")
with mouse.Listener(on_click=on_click) as listener:
listener.join()
Upvotes: 1