PyQt5 - 鼠标连点器

news2024/11/20 14:25:21

文章目录

  • ⭐️前言
  • ⭐️鼠标连点器

⭐️前言

本次设计的鼠标连点器主要是对QVBoxLayout、QHBoxLayout和QStackedWidget进行一个回顾复习,加深对它们的理解,提高运用的熟练度。

⭐️鼠标连点器

如以下代码所示,设计两个QWidget控件,分别为QWidget1和QWidget2,QWidget1中设计的是连点器基本设计窗口,可输入鼠标的点击速度和点击总时长;QWidget2中设计的是连点器执行后的窗口,其中有倒计时准备和执行过程的窗口显示。

from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtGui import QIcon, QColor, QFont
import sys
import threading
import time
from pynput.mouse import Button, Controller


class PushButton(QPushButton):
    def __init__(self, text):
        super().__init__()

        self.setText(text)

    # 设置阴影
    def enterEvent(self, evt):
        # 创建QGraphicsDropShadowEffect对象
        shadow = QGraphicsDropShadowEffect()
        # 设置阴影颜色
        shadow.setColor(QColor(0, 0, 0))
        # 设置阴影的偏移量
        shadow.setOffset(0, 0)
        # 设置阴影的模糊半径
        shadow.setBlurRadius(15)
        # 设置阴影应用于按钮
        self.setGraphicsEffect(shadow)

    # 取消阴影
    def leaveEvent(self, evt):
        self.setGraphicsEffect(None)


class LianDianQi(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowFlags(self.windowFlags() & ~Qt.WindowMinMaxButtonsHint)   # 取消最小最大化按钮
        self.setWindowTitle('街三仔-鼠标连点器')
        self.setWindowIcon(QIcon('./img/window.png'))
        self.resize(200, 150)

        self.mouse = Controller()
        self.MouseFlag = False
        self.active = True

        self.setup_ui()

    def setup_ui(self):
        self.stacked_widget = QStackedWidget(self)
        self.setCentralWidget(self.stacked_widget)

        # 基本设置窗口设计
        self.widget1 = QWidget()
        vbox_groupBox_MousePosition = QVBoxLayout(self.widget1)

        hbox_groupBox_MousePosition1 = QHBoxLayout()
        vbox_groupBox_MousePosition.addLayout(hbox_groupBox_MousePosition1)
        hbox_groupBox_MousePosition1.addWidget(QLabel('点击速度:'))
        self.v_lineEdit = QLineEdit()
        self.v_lineEdit.setText('0.01')
        hbox_groupBox_MousePosition1.addWidget(self.v_lineEdit)
        hbox_groupBox_MousePosition1.addWidget(QLabel('秒/次'))

        hbox_groupBox_MousePosition2 = QHBoxLayout()
        vbox_groupBox_MousePosition.addLayout(hbox_groupBox_MousePosition2)
        hbox_groupBox_MousePosition2.addWidget(QLabel('点击时长:'))
        self.t_lineEdit = QLineEdit()
        self.t_lineEdit.setText('3')
        hbox_groupBox_MousePosition2.addWidget(self.t_lineEdit)
        hbox_groupBox_MousePosition2.addWidget(QLabel('秒'))

        self.PushButton_Execute_Click = PushButton('开始点击')
        self.PushButton_Execute_Click.clicked.connect(self.switch_to_widget2)

        vbox_groupBox_MousePosition.addWidget(self.PushButton_Execute_Click)

        # 倒计时和执行窗口设计
        self.widget2 = QWidget()

        vbox = QVBoxLayout(self.widget2)
        self.label1 = QLabel('倒计时')
        self.label1.setFont(QFont('黑体', 20))
        vbox.addWidget(self.label1, alignment=Qt.AlignCenter)
        self.countdown = True  # True刚进入倒计时的标志

        self.label2 = QLabel('5')
        self.label2.setFont(QFont('黑体', 40))
        vbox.addWidget(self.label2, alignment=Qt.AlignCenter)

        self.timer = QTimer()
        self.timer.timeout.connect(self.update_label)

        self.stacked_widget.addWidget(self.widget1)
        self.stacked_widget.addWidget(self.widget2)

    def switch_to_widget1(self):
        self.stacked_widget.setCurrentWidget(self.widget1)

    def switch_to_widget2(self):
        self.t_text = self.t_lineEdit.text()
        self.v_text = float(self.v_lineEdit.text())
        self.timer.start(1000)  # 1秒执行一次
        self.stacked_widget.setCurrentWidget(self.widget2)

    def update_label(self):
        text = int(self.label2.text()) - 1
        if text != -1:
            self.label2.setText(str(text))

        else:
            if self.countdown:
                self.countdown = False
                self.timer.stop()
                self.label1.setText('开始点击')
                self.label2.setText(self.t_text)
                threading.Thread(target=self.Execute_Click).start()
                self.timer.start(1000)

            else:
                self.timer.stop()
                self.label1.setText('倒计时')
                self.label2.setText('5')
                self.countdown = True
                self.switch_to_widget1()

    def Execute_Click(self):
        end_time = time.time() + float(self.t_lineEdit.text())
        while time.time() < end_time:
            self.mouse.click(Button.left)
            time.sleep(self.v_text)

    # 窗口移动
    def mousePressEvent(self, evt):
        if evt.button() == Qt.LeftButton:
            self.MouseFlag = True
            self.x_origin, self.y_origin = self.x(), self.y()
            self.x_move, self.y_move = evt.globalPos().x(), evt.globalPos().y()

    def mouseMoveEvent(self, evt):
        if self.MouseFlag == True:
            self.move(self.x_origin + (evt.globalPos().x() - self.x_move), self.y_origin + (evt.globalPos().y() - self.y_move))

    def mouseReleaseEvent(self, evt):
        self.MouseFlag = False


if __name__ == '__main__':
    app = QApplication(sys.argv)
    liandianqi = LianDianQi()
    liandianqi.show()
    sys.exit(app.exec_())

运行结果:

  • 写一个窗口测试点击,点击“开始点击”按钮前
    在这里插入图片描述
  • 点击“开始点击”按钮后进入5秒倒计时
    在这里插入图片描述
  • 开始点击。进入设置的3秒点击时长,0.01秒/次的点击速度。鼠标每点击“点击”按钮一次,就会在控制台打印被点击。
    在这里插入图片描述

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

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

相关文章

【学习笔记】python仅拷贝list的值,引出浅拷贝与深拷贝

一、python 仅拷贝list的值&#xff08;来源于gpt&#xff09; 在 Python 中&#xff0c;可以使用切片或 copy() 方法来仅拷贝列表的值。 1、使用切片 a [1, 2, 3, 4, 5] b a[:] # 通过切片来拷贝 a 的值 在上面的代码中&#xff0c;我们使用切片来拷贝列表 a 的值&#xff…

Web前端 ---- 【Vue】Vuex的使用(辅助函数、模块化开发)

目录 前言 Vuex是什么 Vuex的配置 安装vuex 配置vuex文件 Vuex核心对象 actions mutations getters state Vuex在vue中的使用 辅助函数 Vuex模块化开发 前言 本文介绍一种新的用于组件传值的插件 —— vuex Vuex是什么 Vuex 是一个专为 Vue.js 应用程序开发的状态…

MDIO读写控制实验

简介&#xff1a; 以太网&#xff1a; 以太网(Ethernet)是当今现有局域网采用的最通用的通信协议标准&#xff0c; 该标准定义了在局域网中采用的电缆类型和信号处理方法。以太网的分类有标准以太网&#xff08;10Mbit/s&#xff09;、 快速以太网(100Mbit/s)和千兆以太网&am…

计算机服务器中了mkp勒索病毒怎么办,mkp勒索病毒解密数据恢复

网络技术的不断发展&#xff0c;也为网络安全带来了威胁&#xff0c;近期云天数据恢复中心的工程师陆续接到很多企业的求助&#xff0c;在本月&#xff0c;很多企业的计算机服务器遭到了mkp勒索病毒攻击&#xff0c;导致企业计算机系统瘫痪&#xff0c;无法正常工作&#xff0c…

苹果 macOS 14.1.2 正式发布 更新了哪些内容?

苹果今日向 Mac 电脑用户推送了 macOS 14.1.2 更新&#xff08;内部版本号&#xff1a;23B92 | 23B2091&#xff09;&#xff0c;本次更新距离上次发布隔了 28 天。 需要注意的是&#xff0c;因苹果各区域节点服务器配置缓存问题&#xff0c;可能有些地方探测到升级更新的时间略…

配置Smart Link主备备份示例

1、Smart Link和Monitor Link简介。 Smart Link&#xff0c;又叫做备份链路。一个Smart Link由两个接口组成&#xff0c;其中一个接口作为另一个的备份。Smart Link常用于双上行组网&#xff0c;提供可靠高效的备份和快速的切换机制。 Monitor Link是一种接口联动方案&#xff…

Navicat 技术指引 | 适用于 GaussDB 分布式的模型功能

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结…

104.进程创建

目录 进程创建相关的函数 获取当前进程的进程ID&#xff08;PID&#xff09; 获取当前进程的父进程ID&#xff08;PPID&#xff09; 创建一个新的进程 fork()剖析 调用格式 创建子进程 子进程与父进程 父子进程执行流 代码演示 进程创建相关的函数 Linux中进程ID为pi…

【用unity实现100个游戏之18】从零开始制作一个类CSGO/CS2、CF第一人称FPS射击游戏——基础篇4(附项目源码,完结)

免责声明:因为文章附带源码,所以我上锁了,整理不易,但是推荐大家自己手动跟敲代码理解更加深入 本节最终效果 文章目录 本节最终效果前言动画拿出枪 静止 检视枪动画切换行走奔跑动画换子弹动画和音效限制跑步和换弹期间不可以射击,换弹期间也不可以检视枪开火动画瞄准动画…

linux文件查找_which_find_locate

7.1 文件查找 7.1.1 简介 which&#xff1a;命令查找 ​ find&#xff1a;文件查找&#xff0c;针对文件名 ​ locate&#xff1a;文件查找&#xff0c;依赖数据库7.1.2 which which命令用于查找文件。 ​ which指令会在环境变量$PATH设置的目录里查找符合条件的文件。 whi…

Appium获取toast方法封装

一、前置说明 toast消失的很快&#xff0c;并且通过uiautomatorviewer也不能获取到它的定位信息&#xff0c;如下图&#xff1a; 二、操作步骤 toast的class name值为android.widget.Toast&#xff0c;虽然toast消失的很快&#xff0c;但是它终究是在Dom结构中出现过&…

在工作中灵活运用CHATGPT

问CHAT&#xff1a;基于微课技术的小学创新课堂教学模式开题&#xff0c;重要变更&#xff0c;侧重说明对照课题申请书、根据评议专家意见所作的研究计划调整 CHAT回复&#xff1a;在本研究项目的开题阶段&#xff0c;我们设想通过利用微课技术来提高小学创新课堂的教学质量。 …

2021年第十届数学建模国际赛小美赛C题读这篇文章有多难解题全过程文档及程序

2021年第十届数学建模国际赛小美赛 C题 读这篇文章有多难 原题再现&#xff1a; 有些英语文本更容易阅读&#xff0c;比如低年级英语考试中出现的阅读材料。然而&#xff0c;有些文本很难阅读&#xff0c;需要读者接受一定程度的教育才能理解。让我们研究一下如何衡量英语文本…

香港高防服务器的选择及几个常见疑问解答

​  互联网的迅猛发展&#xff0c;不仅带来的是机遇&#xff0c;同样也有挑战&#xff0c;比如恶意攻击的频发泛滥&#xff0c;让一些正规企业网站、游戏网站、购物网站等成为了 DDoS 攻击的目标点&#xff0c;所以我们在使用香港服务器时&#xff0c;也不得不为它加一层“护…

【keil备忘录】2. stm32 keil仿真时的时间测量功能

配置仿真器Trace内核时钟为单片机实际的内核时钟&#xff0c;需要勾选Enable设置&#xff0c;设置完成后Enable取消勾选也可以&#xff0c;经测试时钟频率配置仍然生效&#xff0c;此处设置为48MHZ: 时间测量时必须打开register窗口&#xff0c;否则可能不会计数 右下角有计…

智能优化算法应用:基于鹈鹕算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鹈鹕算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鹈鹕算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鹈鹕算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

Java 使用oshi获取当前服务器状态cpu、内存、存储等核心信息

文章目录 简介相关资料maven依赖oshi-官方示例获取CUP信息代码获取内存信息获取磁盘信息 简介 OSHI 是基于 JNA 的&#xff08;本地&#xff09;操作系统和硬件信息库。它不需要安装任何其他额外的本地库&#xff0c;旨在提供一种跨平台的实现来检索系统信息&#xff0c;例如操…

Clean 架构下的现代 Android 架构指南

Clean 架构下的现代 Android 架构指南 Clean 架构是 Uncle Bob 提出的一种软件架构&#xff0c;Bob 大叔同时也是 SOLID 原则的命名者。 Clean 架构图如下&#xff1a; 这张图描述的是整个软件系统的架构&#xff0c;而不是单体软件&#xff0c;其中至少包括服务端以及客户端…

探秘 JAVA 诞生之路,引领编程人生的宏伟著作

目录 一. 前言 二. Java 发展史 2.1. 1990年年末 2.2. 1991年 2.3. 1992年夏天 2.4. 1994年 2.5. 1995年 2.6. 1996年&#xff08;JDK1.0&#xff09; 2.7. 1997年&#xff08;JDK1.1&#xff09; 2.8. 1998年&#xff08;JDK1.2&#xff09; 2.9. 1999年&#xff0…

第十四章 : Spring Boot 整合spring-session,使用redis共享

第十四章 &#xff1a; Spring Boot 整合spring-session,使用redis共享 前沿 本文重点讲述&#xff1a;spring boot工程中使用spring-session机制进行安全认证&#xff0c;并且通过redis存储session&#xff0c;满足集群部署、分布式系统的session共享。 基于SPringBoot 2.3.2…