Python 3 Autoclicker On / Off热键

时间:2017-05-06 00:54:35

标签: python

我是Python的新手,我认为我将一个简单的自动转换器作为一个很酷的启动项目。

我希望用户能够指定点击间隔,然后使用热键打开和关闭自动点击。

我知道Ctrl-C,你会在我当前的代码中看到它,但是我想让程序工作,这样就不必在python窗口中激活热键。 / p>

import pyautogui, sys

print("Press Ctrl + C to quit.")

interval = float(input("Please give me an interval for between clicks in seconds: "))

try:
    while True:
        pyautogui.click()
except KeyboardInterrupt:
print("\n")

我是否需要制作一个tkinter消息框来进行切换,还是可以使用热键?

感谢您的帮助。

更新

import multiprocessing
import time
import pyHook, pyautogui, pythoncom
import queue

click_interval = float(input("Please give an interval between clicks in seconds: "))

class AutoClicker(multiprocessing.Process):
    def __init__(self, queue, interval):
        multiprocessing.Process.__init__(self)
        self.queue = queue
        self.click_interval = click_interval

    def run(self):
        while True:
            try:
                task = self.queue.get(block=False)
                if task == "Start":
                    print("Clicking...")
                    pyautogui.click(interval == click_interval)

            except task == "Exit":
                print("Exiting")
                self.queue.task_done()
                break
        return

def OnKeyboardEvent(event):

    key = event.Key

    if key == "F3":
        print("Starting auto clicker")
        # Start consumers
        queue.put("Start")
        queue.join
    elif key == "F4":
        print("Stopping auto clicker")
        # Add exit message to queue
        queue.put("Exit")
        # Wait for all of the tasks to finish
        queue.join()

    # return True to pass the event to other handlers
    return True

if __name__ == '__main__':
    # Establish communication queues
    queue = multiprocessing.JoinableQueue()
    # create a hook manager
    hm = pyHook.HookManager()
    # watch for all mouse events
    hm.KeyDown = OnKeyboardEvent
    # set the hook
    hm.HookKeyboard()
    # wait forever
    pythoncom.PumpMessages()


AutoClicker.run(self)

1 个答案:

答案 0 :(得分:1)

首先,如果要监视Python窗口之外的全局输入,则需要pyHook或类似的东西。它将允许您监视键盘事件。我选择按F3F4按键操作,用于启动和停止自动转换。

要完成你所问的内容,我所知道的最好的方法是创建一个进程来进行点击,并通过使用队列与之进行通信。按下F4键后,它会向队列中添加"Exit"字符串。自动闪烁将识别此然后返回。

在按下F4键之前,队列将保持为空,并且queue.Empty异常将不断发生。这将执行单击鼠标。

import multiprocessing
import time
import pyHook, pyautogui, pythoncom
import queue

class AutoClicker(multiprocessing.Process):
    def __init__(self, queue, interval):
        multiprocessing.Process.__init__(self)
        self.queue = queue
        self.click_interval = interval

    def run(self):
        while True:
            try:
                task = self.queue.get(block=False)
                if task == "Exit":
                    print("Exiting")
                    self.queue.task_done()
                    break

            except queue.Empty:
                time.sleep(self.click_interval)
                print("Clicking...")
                pyautogui.click()
        return

def OnKeyboardEvent(event):

    key = event.Key

    if key == "F3":
        print("Starting auto clicker")
        # Start consumers
        clicker = AutoClicker(queue, 0.1)
        clicker.start()
    elif key == "F4":
        print("Stopping auto clicker")
        # Add exit message to queue
        queue.put("Exit")
        # Wait for all of the tasks to finish
        queue.join()

    # return True to pass the event to other handlers
    return True

if __name__ == '__main__':
    # Establish communication queues
    queue = multiprocessing.JoinableQueue()
    # create a hook manager
    hm = pyHook.HookManager()
    # watch for all mouse events
    hm.KeyDown = OnKeyboardEvent
    # set the hook
    hm.HookKeyboard()
    # wait forever
    pythoncom.PumpMessages()

请记住,这个实现远非完美,但希望它有助于作为一个起点。

为什么我不能使用简单的while循环或if / else语句?

while循环正在阻塞,这意味着当循环运行时,它会阻止所有其他代码执行。

因此,一旦点击器循环开始,它将无限期地卡在该循环中。在发生这种情况时,您无法检查F4键按下,因为循环将阻止执行任何其他代码(即检查按键的代码)。由于我们希望自动点击器点击和按键检查同时发生,因此它们需要是单独的进程(因此它们不会相互阻塞)。

检查按键操作的主要过程需要能够以某种方式与自动点击器进程通信。因此,当按下F4键时,我们希望退出点击过程。使用队列是一种通信方式(还有其他方式)。自动点击器可以从while循环内部连续检查队列。当我们想要停止点击时,我们可以从主进程向队列添加"Exit"字符串。下一次点击者进程读取队列时,它会看到并中断。