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

news2024/9/22 15:49:50

创建一个带有 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 键进行控制。希望这篇博客对你有所帮助!如果你有任何问题或需要进一步的帮助,请随时留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2155393.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

理解JVM中的死锁:原因及解决方案

死锁是并发应用程序中的常见问题。在此类应用程序中,我们使用锁定机制来确保线程安全。此外,我们使用线程池和信号量来管理资源消耗。然而,在某些情况下,这些技术可能会导致死锁。 在本文中,我们将探讨死锁、死锁出现…

蓝桥杯模块一:LED指示灯的基本控制

模块训练一:LED指示灯的基本控制 模块1到模块13都是通过I\O模式进行设计 一、电路图 二、电路分析 1.74HC573锁存器介绍 OE端接地,上电即工作,控制LE端,当LE端接高电平时,锁存器开始工作,接通D和Q 2.电路工作原理分析…

C语言 | Leetcode C语言题解之第415题字符串相加

题目: 题解: char* addStrings(char* num1, char* num2) {int i strlen(num1) - 1, j strlen(num2) - 1, add 0;char* ans (char*)malloc(sizeof(char) * (fmax(i, j) 3));int len 0;while (i > 0 || j > 0 || add ! 0) {int x i > 0 ?…

SpringCloud入门(五)Nacos注册中心(上)

国内公司一般都推崇阿里巴巴的技术,比如注册中心,SpringCloudAlibaba也推出了一个名为Nacos的注册中心。Dynami Naming and Configuration Service。是阿里巴巴2018年7月开源的项目。 Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。…

nuget包管理

1、下载 下载nuget 下载nuget.exe,配置系统环境变量,打开电脑属性一高级系统设置一环境变量一系统变量,选择Path,添加nuget.exe目录 2、常用命令 nuget install System.Data.SQLITE -SolutionDirectory D:\NugetPackages\ -Packa…

基于BiGRU+Attention实现风力涡轮机发电量多变量时序预测(PyTorch版)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对…

37. Vector3与模型位置、缩放属性

本文章给通过组对象Group (opens new window)给大家讲解一下threejs层级模型或树结构的概念。 Group层级模型(树结构)案例 下面代码创建了两个网格模型mesh1、mesh2,通过THREE.Group类创建一个组对象group,然后通过add方法把网格模型mesh1、mesh2作为设置为组对象g…

【Godot4.3】GraphEdit全解析(1) - 基础介绍

概述 最早系统性的讲述Godot的GraphEdit和GraphNode的教程应该是Hi小胡的了,也有小伙伴已经设计出一些插件或小应用用于辅助自己的项目。或者更直观的你可以去看看B站的Godot的Visual Shader教程。 我是学了好几次,学完就忘了用,本篇是基于…

Java只有国人在搞了?

从Java诞生到现在,在全球一直属于最大的开发平台,拥有着世界上最多的开发者和最活跃的社区。你说Java只有国人在搞就有点过分了,Java中常用的主流框架全是外国人写的,虽说阿里也为Java做了很多贡献,但你还真没有资格说…

代码随想录Day 52|题目:101.孤岛的面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿

提示:DDU,供自己复习使用。欢迎大家前来讨论~ 文章目录 图论part03题目一:101.孤岛的总面积解题思路DFS**BFS** 题目二:102. 沉没孤岛解题思路 题目三:103. 水流问题解题思路优化 题目四:104.建造最大岛屿…

Windows11+Microsoft MPI v10.1.3 安装配置记录

WindowsMicrosoft MPI v10.1.3 安装配置记录 MS-MPI 安装VS中进行配置属性管理器-添加新项目属性表VC目录-包含目录链接器-常规-附加库目录链接器-输入-附加依赖项 测试 某个项目需要MPI支持,在此记录MS MPI的安装配置过程。 MS-MPI 安装 在微软官网下载 两个都下…

去中心化的力量:探索Web3的分布式网络

Web3作为一种新兴的网络架构,代表了对互联网发展的一种探索。与传统的中心化互联网模式相比,Web3致力于通过去中心化的方式构建更加开放和透明的数字世界。本文将探讨Web3的核心理念、技术实现及其潜在应用。 一、去中心化的核心理念 Web3的去中心化理…

深度学习02-pytorch-06-张量的形状操作

在 PyTorch 中,张量的形状操作是非常重要的,可以让你灵活地调整和处理张量的维度和数据结构。以下是一些常用的张量形状函数及其用法,带有详细解释和举例说明: 1. reshape() 功能: 改变张量的形状,但不改变数据的顺序…

Stable Diffusion 使用详解(12)--- 设计师风格变换

目录 背景 seg模型(语义分割) 描述 原理 实战-装修风格变换 现代风格 欧式风格转换 提示词及相关参数设置 模型选择 seg cn 加持 效果 还能做点啥 问题 解决方法 出图效果 二次优化调整 二次出图效果 地中海风格转换 参数修改 效果 …

软硬件项目运维方案(Doc原件完整版套用)

1 系统的服务内容 1.1 服务目标 1.2 信息资产统计服务 1.3 网络、安全系统运维服务 1.4 主机、存储系统运维服务 1.5 数据库系统运维服务 1.6 中间件运维服务 2 运维服务流程 3 服务管理制度规范 3.1 服务时间 3.2 行为规范 3.3 现场服务支持规范 3.4 问题记录规范…

C++容器list底层迭代器的实现逻辑~list相关函数模拟实现

目录 1.两个基本的结构体搭建 2.实现push_back函数 3.关于list现状的分析(对于我们如何实现这个迭代器很重要) 3.1和string,vector的比较 3.2对于list的分析 3.3总结 4.迭代器类的封装 5.list容器里面其他函数的实现 6.个人总结 7.代码附录 1.两…

【C++ Primer Plus习题】17.1

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> using namespace std;int main() {char …

移动登录页:让用户开启一段美好的旅程吧。

Hi,大家好&#xff0c;我是大千UI工场&#xff0c;移动登录页千千万&#xff0c;这里最好看&#xff0c;本期分享一批移动端的登录页面&#xff0c;供大家欣赏。 本次分享的是毛玻璃/3D风格的登录页。

【Unity设计模式】Unity MVC/MVP架构介绍,及MVC/MVP框架的简单应用

文章目录 什么是MVC&#xff1f;MVC眼花缭乱设计图MVP和MVC最经典的MVC的业务流程Unity MVC 框架示例1. 创建项目结构2. 实现模型3. 实现视图4. 实现控制器5. 使用示例 总结参考完结 什么是MVC&#xff1f; MVC自1982年被设计出来&#xff0c;至今都有着很大比重的使用率&…

前端项目代码开发规范及工具配置

在项目开发中&#xff0c;良好的代码编写规范是项目组成的重要元素。本文将详细介绍在项目开发中如何集成相应的代码规范插件及使用方法。 项目规范及工具 集成 EditorConfig集成 Prettier1. 安装 Prettier2. 创建 Prettier 配置文件3. 配置 .prettierrc4. 使用 Prettier 集成 …