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

ops/2024/9/22 17:52:36/

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

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

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

pip install pyautogui pynput

项目结构

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

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

代码实现

python">import tkinter as tk
from tkinter import ttk, messagebox
import pyautogui
import time
import threading
from pynput import keyboardclass AutomaticClicker(tk.Tk):def __init__(self):super().__init__()self.title("自动点击器")self.geometry("400x300")self.is_running = Falseself.interval = 0.01  # 默认间隔时间1秒self.mouse_button = "left"  # 默认左键点击self.click_type = "single"  # 默认单击self.repeat_times = 999  # 默认重复次数self.delay = 0  # 默认延迟为0msself.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))  # 默认0msdelay_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 = Trueself.start_button["state"] = tk.DISABLEDself.stop_button["state"] = tk.NORMALself.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:breakx, y = pyautogui.position()  # 获取当前鼠标位置pyautogui.moveTo(x, y)  # 移动鼠标到当前位置clicks = 2 if self.click_type == "double" else 1pyautogui.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 = Falseself.start_button["state"] = tk.NORMALself.stop_button["state"] = tk.DISABLEDif 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 键进行控制。希望这篇博客对你有所帮助!如果你有任何问题或需要进一步的帮助,请随时留言。


http://www.ppmy.cn/ops/114354.html

相关文章

P9235 [蓝桥杯 2023 省 A] 网络稳定性

*原题链接* 最小瓶颈生成树题,和货车运输完全一样。 先简化题意, 次询问,每次给出 ,问 到 的所有路径集合中,最小边权的最大值。 对于这种题可以用kruskal生成树来做,也可以用倍增来写,但不…

JSON.parseArray 内存溢出

实际上我的JSON如下: 如果用以下代码:JVM的内存直接飙到内存溢出,报错OutOfMemoryError: Java heap space Object oo JSON.parseArray(json, TestVo.class) 如果我换成了这样,就没事: Object oo JSON.parseObject(…

MISC - 第一天(stegsolve图片隐写解析器、QR research、binwalk,dd文件分离,十六进制文件编辑器)

前言 各位师傅大家好,我是qmx_07,最近更新Buuctf在线测评中的MISC杂项内容 介绍 BUUCTF:https://buuoj.cn/ ,整合了各大 CTF 赛事题目,类型丰富,涵盖了Web 安全、密码学、系统安全、逆向工程、代码审计等多个领域 …

VUE面试题(单页应用及其首屏加载速度慢的问题)

目录 一、单页应用 1.概念 2.单页面应用的优缺点 二、多页面应用: 1.概念 2.区别 三、SPA的实现 1.原理 2.方式: 3.Hash与History模式有什么区别 四、首屏加载速度慢如何优化 1.什么是首屏加载? 2.首屏加载慢的原因 3.如何解决…

Qt 学习第十天:小项目:QListWidget的使用

一、页面布局 二、命名按钮 双击按钮可以修改显示中的文字(例如:改成“全选”),objectName是要改成程序员所熟悉的名字(英文,符合代码规范)方便修改和书写代码,一看就能看懂的 三、…

使用IDA Pro动态调试Android APP

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 关于 android_server android_server 是 IDA Pro 在 Android 设备上运行的一个调试服务器。 通过在 Android 设备上运行android_server,IDA Pro …

Mybatis的XML实现方法

Mybatis的开发有两种方式: 1、注解 2、XML 使用Mybatis的注解方式,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句,也就是将SQL语句写在XML配置文件中。 Mybatis的XML的实现需要以下…

Android 开发高频面试题之——Flutter

Android开发高频面试题之——Java基础篇 flutter高频面试题记录 Flutter1. dart中的作用域与了解吗2. dart中. .. ...分别是什么意思?3. Dart 是不是单线程模型?如何运行的?4. Dart既然是单线程模型支持多线程吗?5. Future是什么6. Stream是什么7. Flutter 如何和原生交互…