Python 3 Autoclicker 开/关热键

标签 python

我是 Python 的新手,我想我会制作一个简单的自动点击器作为一个很酷的入门项目。

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

我知道 Ctrl-C,您会在我当前的代码中看到这一点,但我希望程序能够运行,以便不必在 python 窗口中激活热键。

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)

最佳答案

首先,如果你想在 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" 字符串。下次 Clicker 进程读取队列时,它会看到这一点并中断。

关于Python 3 Autoclicker 开/关热键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43815603/

相关文章:

python - 如果所有值都是某个字符串,则删除 pandas 数据框中的列

python - 尝试微调 NER 的 ReformerModelWithLMHead (google/reformer-enwik8) 时出错

python - 在 Python 中将 scad 文件格式转换为 STL

python - 识别正则表达式匹配的前缀

Python:如何根据星期几获取数据框中某个范围内的项目数?

python - Flask 从父目录导入应用程序

python - 将Python文件作为linux命令执行

python - 根据另一列中的相同值组合 pandas 数据框列中的文本值

python - 如何提高 REST API 的性能?

python - 为什么元类会改变 issubclass() 的工作方式?