我是 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或类似的东西。它将允许您监视键盘事件。我选择对 F3
和 F4
按键进行操作,它们用于启动和停止自动点击器。
要完成您所要求的,我知道的最好方法是创建一个执行点击的进程,并通过使用队列与其通信。当按下 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/