Python 3自动舔板机开/关热键

2024-04-26 18:26:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python新手,我想做一个简单的autoclicker作为一个很酷的入门项目。在

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

我知道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消息框来进行切换还是可以使用热键?在

谢谢你的帮助。在

更新

^{pr2}$

Tags: 项目代码用户import程序间隔syspress
1条回答
网友
1楼 · 发布于 2024-04-26 18:26:47

首先,如果您想监视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循环是阻塞的,这意味着当循环运行时,它会阻止所有其他代码的执行。在

所以一旦clicker循环启动,它将无限期地停留在循环中。当发生这种情况时,你不能检查F4键的按下情况,因为循环将阻止任何其他代码的执行(即检查按键的代码)。因为我们希望自动点击和按键检查同时发生,所以它们需要是单独的过程(这样它们就不会互相阻止)。在

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

相关问题 更多 >