创建一个带有 F6 快捷键的自动点击器

创建一个带有 F6 快捷键的自动点击器
在许多情况下,自动化点击任务可以帮助我们节省大量时间和精力。本文将介绍如何使用 Python 和 Tkinter 创建一个简单的自动点击器,并通过 F6 键作为快捷键来控制点击器的开始和停止,即使应用程序在后台也能正常工作。

所需库
首先,我们需要安装一些必要的 Python 库:

tkinter:用于创建图形用户界面。
pyautogui:用于模拟鼠标点击。
pynput:用于监听全局键盘事件。
你可以使用以下命令来安装这些库:

pip install pyautogui pynput

项目结构

我们的自动点击器将包含以下功能:

  1. 通过 GUI 设置点击间隔、鼠标按键、点击方式、重复次数和延迟。
  2. 显示当前鼠标位置并允许手动获取鼠标位置。
  3. 使用 F6 键作为快捷键来开始和停止点击器,即使应用程序在后台也能正常工作。

代码实现

import tkinter as tk
from tkinter import ttk, messagebox
import pyautogui
import time
import threading
from pynput import keyboard

class AutomaticClicker(tk.Tk):
    def __init__(self):
        super().__init__()

        self.title("自动点击器")
        self.geometry("400x300")

        self.is_running = False
        self.interval = 0.01  # 默认间隔时间1秒
        self.mouse_button = "left"  # 默认左键点击
        self.click_type = "single"  # 默认单击
        self.repeat_times = 999  # 默认重复次数
        self.delay = 0  # 默认延迟为0ms

        self.create_widgets()
        self.update_mouse_position()  # 开始实时更新鼠标位置

        # 设置全局键盘监听器
        self.listener = keyboard.Listener(on_press=self.on_key_press)
        self.listener.start()

    def create_widgets(self):
        # 每次鼠标点击的间隔时间
        interval_frame = ttk.Frame(self)
        interval_label = ttk.Label(interval_frame, text="每次鼠标点击的间隔时间(秒):")
        self.interval_entry = ttk.Entry(interval_frame, width=5)
        self.interval_entry.insert(0, str(self.interval))  # 默认值1秒
        interval_label.grid(row=0, column=0, padx=(10, 0), pady=(10, 0))
        self.interval_entry.grid(row=0, column=1, padx=(0, 10), pady=(10, 0))
        interval_frame.pack(padx=10, fill=tk.X)

        # 鼠标按键
        mouse_button_frame = ttk.Frame(self)
        mouse_button_label = ttk.Label(mouse_button_frame, text="鼠标按键:")
        self.mouse_button_combobox = ttk.Combobox(
            mouse_button_frame, values=["鼠标左键", "鼠标右键"], state="readonly"
        )
        self.mouse_button_combobox.current(0)  # 默认左键
        mouse_button_label.grid(row=0, column=0, padx=(10, 0), pady=(10, 0))
        self.mouse_button_combobox.grid(row=0, column=1, padx=(0, 10), pady=(10, 0))
        mouse_button_frame.pack(padx=10, fill=tk.X)

        # 点击方式
        click_type_frame = ttk.Frame(self)
        click_type_label = ttk.Label(click_type_frame, text="点击方式:")
        self.click_type_combobox = ttk.Combobox(
            click_type_frame, values=["鼠标单击", "鼠标双击"], state="readonly"
        )
        self.click_type_combobox.current(0)  # 默认单击
        click_type_label.grid(row=0, column=0, padx=(10, 0), pady=(10, 0))
        self.click_type_combobox.grid(row=0, column=1, padx=(0, 10), pady=(10, 0))
        click_type_frame.pack(padx=10, fill=tk.X)

        # 重复次数
        repeat_times_frame = ttk.Frame(self)
        repeat_times_label = ttk.Label(repeat_times_frame, text="重复次数:")
        self.repeat_times_entry = ttk.Entry(repeat_times_frame, width=5)
        self.repeat_times_entry.insert(0, str(self.repeat_times))  # 默认1次
        repeat_times_label.grid(row=0, column=0, padx=(10, 0), pady=(10, 0))
        self.repeat_times_entry.grid(row=0, column=1, padx=(0, 10), pady=(10, 0))
        repeat_times_frame.pack(padx=10, fill=tk.X)

        # 延迟
        delay_frame = ttk.Frame(self)
        delay_label = ttk.Label(delay_frame, text="延迟(ms):")
        self.delay_entry = ttk.Entry(delay_frame, width=5)
        self.delay_entry.insert(0, str(self.delay))  # 默认0ms
        delay_label.grid(row=0, column=0, padx=(10, 0), pady=(10, 0))
        self.delay_entry.grid(row=0, column=1, padx=(0, 10), pady=(10, 0))
        delay_frame.pack(padx=10, fill=tk.X)

        # 显示当前鼠标位置
        self.position_label = ttk.Label(self, text="当前鼠标位置: ")
        self.position_label.pack(pady=(10, 0))

        # 获取鼠标位置按钮
        get_position_button = ttk.Button(
            self, text="手动获取当前鼠标位置", command=self.get_mouse_position
        )
        get_position_button.pack(pady=(10, 0))

        # 开始按钮
        self.start_button = ttk.Button(self, text="开始", command=self.start_clicking)
        self.start_button.pack(pady=(10, 0))

        # 停止按钮
        self.stop_button = ttk.Button(self, text="停止", command=self.stop_clicking, state=tk.DISABLED)
        self.stop_button.pack(padx=10, pady=(10, 0))

    def get_mouse_position(self):
        x, y = pyautogui.position()
        messagebox.showinfo("鼠标位置", f"X: {x}, Y: {y}")

    def update_mouse_position(self):
        x, y = pyautogui.position()
        self.position_label.config(text=f"当前鼠标位置: X: {x}, Y: {y}")
        self.after(100, self.update_mouse_position)  # 每100毫秒更新一次

    def start_clicking(self):
        self.update_settings()  # 更新设置
        if not self.is_running:
            self.is_running = True
            self.start_button["state"] = tk.DISABLED
            self.stop_button["state"] = tk.NORMAL

            self.thread = threading.Thread(target=self._async_start_clicking)
            self.thread.start()

    def _async_start_clicking(self):
        for _ in range(self.repeat_times):
            if not self.is_running:
                break
            x, y = pyautogui.position()  # 获取当前鼠标位置
            pyautogui.moveTo(x, y)  # 移动鼠标到当前位置
            clicks = 2 if self.click_type == "double" else 1
            pyautogui.click(button=self.mouse_button, clicks=clicks, interval=self.interval)
            if self.delay > 0:
                time.sleep(self.delay / 1000.0)

            # 增加一个短暂的睡眠以允许主线程处理事件,比如停止请求
            time.sleep(0.01)

    def stop_clicking(self):
        self.is_running = False
        self.start_button["state"] = tk.NORMAL
        self.stop_button["state"] = tk.DISABLED
        if self.thread and self.thread.is_alive():
            self.thread.join()  # 等待线程结束

    def update_settings(self):
        try:
            self.interval = float(self.interval_entry.get())
            self.repeat_times = int(self.repeat_times_entry.get())
            self.delay = int(self.delay_entry.get())
            self.mouse_button = (
                "right" if self.mouse_button_combobox.get() == "鼠标右键" else "left"
            )
            self.click_type = (
                "double" if self.click_type_combobox.get() == "鼠标双击" else "single"
            )
        except ValueError:
            messagebox.showerror("错误", "请输入有效的数值。")
            self.stop_clicking()  # 如果有错误,则停止点击

    def on_key_press(self, key):
        try:
            if key == keyboard.Key.f6:
                self.toggle_clicking()
        except AttributeError:
            pass  # 忽略非字符键

    def toggle_clicking(self):
        if self.is_running:
            self.stop_clicking()
        else:
            self.start_clicking()

if __name__ == "__main__":
    app = AutomaticClicker()
    app.mainloop()

总结

通过上述步骤,我们成功创建了一个带有 F6 快捷键的自动点击器。这个点击器不仅可以通过 GUI 控制,还可以通过全局键盘监听器在后台使用 F6 键进行控制。希望这篇博客对你有所帮助!如果你有任何问题或需要进一步的帮助,请随时留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值