我是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)
答案 0 :(得分:1)
首先,如果要监视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"
字符串。下一次点击者进程读取队列时,它会看到并中断。