首页 > 解决方案 > 自动点击器代码不起作用(第一个项目)

问题描述

我正在尝试使用 pynput 制作一个自动点击器作为我的第一个项目,但我很难理解为什么我的代码不起作用。该代码用于在我点击“ctrl + alt + i”并每 1 秒点击一次时开始/停止点击。这是我当前的代码。我真的不明白为什么它不起作用,但到目前为止我所做的是“click_thread.running”正在从 true 变为 false,python 听我的键盘,并且点击只有在我设置时才有效“ClickMouse ”类中的“self.running”为真。我从打印“click_thread.running”中得到的输出似乎从真变为假,但如果发生这种情况,那么为什么不开始点击?我想这与它是“threading.Thread”的子类有关吗?还是我把课弄错了?不管怎样,我已经为此工作了几天,我觉得我已经撞到了墙,试图独自解决这个问题。非常感谢任何帮助!

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()

标签: pythonmultithreadingtimelistenerpynput

解决方案


只要您调用click_thread.start(),处理程序就会在新线程中start调用您的函数。run那时,self.runningFalse。因此,您的 while 循环将立即退出,线程将结束。

所以,设置running=True为默认值,直到on_activate_i.

你在哪里点击?随意?


推荐阅读