使用PyQt5实现一个鼠标连点器

 更新时间:2023年12月08日 11:32:33   作者:街 三 仔  
这篇文章主要为大家详细介绍了如何使用PyQt5实现一个鼠标连点器,从而对QVBoxLayout、QHBoxLayout和QStackedWidget进行一个回顾复习,需要的可以参考一下

前言

本次设计的鼠标连点器主要是对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秒/次的点击速度。鼠标每点击“点击”按钮一次,就会在控制台打印被点击。

以上就是使用PyQt5实现一个鼠标连点器的详细内容,更多关于PyQt5鼠标连点器的资料请关注脚本之家其它相关文章!

相关文章

  • 布同自制Python函数帮助查询小工具

    布同自制Python函数帮助查询小工具

    Python的自带文档功能很不错,给与我耳目一新的感觉。如果在CMD中进行“行式编程”编程的话,可以随时随地的查询函数的功能,非常方便。
    2011-03-03
  • Pyqt5将多个类组合在一个界面显示的完整示例

    Pyqt5将多个类组合在一个界面显示的完整示例

    这篇文章主要给大家介绍了关于Pyqt5将多个类组合在一个界面显示的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-09-09
  • python Autopep8实现按PEP8风格自动排版Python代码

    python Autopep8实现按PEP8风格自动排版Python代码

    这篇文章主要介绍了python Autopep8实现按PEP8风格自动排版Python代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 详解Python中的__init__和__new__

    详解Python中的__init__和__new__

    这篇文章主要介绍了Python中的__init__和__new__的区别和实例详解它们的作用,需要的朋友可以参考下
    2014-03-03
  • Python如何通过ARIMA模型进行时间序列分析预测

    Python如何通过ARIMA模型进行时间序列分析预测

    这篇文章主要介绍了Python如何通过ARIMA模型进行时间序列分析预测问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • python实现彩色图转换成灰度图

    python实现彩色图转换成灰度图

    这篇文章主要为大家详细介绍了python实现彩色图转换成灰度图,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Pandas格式化DataFrame的浮点数列的实现

    Pandas格式化DataFrame的浮点数列的实现

    本文主要介绍了Pandas格式化DataFrame的浮点数列的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • python如何利用traceback获取详细的异常信息

    python如何利用traceback获取详细的异常信息

    异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置。这篇文章主要给大家介绍了关于python如何利用traceback获取详细的异常信息的相关资料,需要的朋友可以参考下
    2021-06-06
  • pandas || df.dropna() 缺失值删除操作

    pandas || df.dropna() 缺失值删除操作

    这篇文章主要介绍了pandas || df.dropna() 缺失值删除操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • python基础知识之索引与切片详解

    python基础知识之索引与切片详解

    在python的学习过程,有些同学对索引和切换会感到困惑,今天我们就来弄清楚它,下面这篇文章主要给大家介绍了关于python基础知识之索引与切片的相关资料,需要的朋友可以参考下
    2022-05-05

最新评论