pyqt5,波形进度条

py Qt5 进度条 动态

大多数也都是缝补的直接上代码可运行
python 3.8
pyqt5

#水波进度
#aut  evildoer 202206017
import math
import sys
from PyQt5 import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from threading import Timer
import time

def qMin(va1, va2):
    if va1<=va2:
        return va1
    else:
        return va2
    pass
class cirulars(QWidget):
    def __init__(self, parent=None):
        super(QWidget, self).__init__(parent)
        self.setWindowFlags(Qt.FramelessWindowHint)  # 去边框
        self.setAttribute(Qt.WA_TranslucentBackground)  # 设置窗口背景透明
        self.fsize = 10
        self.resize(400, 400)
        self.layout = QGridLayout(self)
        # 背景填充灰色
        self.setAutoFillBackground(True)
        p = QPalette()
        p.setColor(QPalette.Background, QColor(237, 237, 237))
        self.setPalette(p)
        # 设置进度条颜色
        self.bg_color = QColor(0, 0xBF, 0xBB)
        self.bg_colors = QColor(0, 0xBF, 0xBB)
        # 设置界面刷新时间
        self.startTimer(80)
        self.m_waterOffset = 0.05
        self.m_offset = 50
        self.m_borderwidth = 10
        # 进度条进度范围0-100
        self.per_num = 0

        self.statuc = False  # false is updata    true is star
        self.cunt =0  #0_4
        # self.setMouseTracking(True)
    # def updataviw(self):
    #     self.update()
    #     QApplication.processEvents()

    def paintEvent(self, event):
        if self.cunt>0:
            self.cunt -=1
        # print(self.cunt)
        # 锯齿状绘画板;
        painter = QPainter()
        painter.setRenderHint(QPainter.Antialiasing)
        painter.begin(self)
        painter.setPen(Qt.NoPen)
        # 获取窗口的宽度和高度
        width, height = self.width(), self.height()
        side = qMin(width, height)
        percentage = 1 - self.per_num / 100
        if self.statuc:
            percentage=0
        # 水波走向:正弦函数 y = A(wx+l) + k
        # w 表示 周期,值越大密度越大
        w = 2 * math.pi / (side) # width ->side
        # A 表示振幅 ,理解为水波的上下振幅
        A = height * self.m_waterOffset
        # k 表示 y 的偏移量,可理解为进度
        k = height * percentage

        water1 = QPainterPath()
        water2 = QPainterPath()

        # 起始点
        water1.moveTo(0, height)
        water2.moveTo(0, height)
        self.m_offset += 0.6

        if (self.m_offset > (width / 2)):
            self.m_offset = 0
        i = 5
        rect = QRectF(self.fsize, self.fsize, width - self.fsize * 2, height - self.fsize * 2)
        while (i < width - 5):
            waterY1 = A * math.sin(w * i + self.m_offset) + k
            waterY2 = A * math.sin(w * i + self.m_offset + width / 2 * w) + k

            water1.lineTo(i, waterY1)
            water2.lineTo(i, waterY2)
            i += 1

        water1.lineTo(width - 5, height)
        water2.lineTo(width - 5, height)
        totalpath = QPainterPath()
        # totalpath.addRect(QRectF(5, 5, self.width() - 10, self.height() - 10))
        # painter.setBrush(Qt.gray)
        painter.drawRect(self.rect())
        painter.save()
        totalpath.addEllipse(rect)
        totalpath.intersected(water1)
        painter.setPen(Qt.NoPen)

        # 设置水波的透明度
        if self.statuc:
            if(self.cunt>5):
                watercolor1 = QColor(self.bg_colors)
                watercolor1.setAlpha(0) #100
                watercolor2 = QColor(self.bg_colors)
                watercolor2.setAlpha(0) #150
            else:
                watercolor1 = QColor(self.bg_colors)
                watercolor1.setAlpha(120 - (self.cunt +1 ) * 20)  # 100
                watercolor2 = QColor(self.bg_colors)
                watercolor2.setAlpha(120 - (self.cunt + 1 ) * 20+50)  # 150
        else:
            if (self.cunt > 5):
                watercolor1 = QColor(self.bg_color)
                watercolor1.setAlpha(0) #100
                watercolor2 = QColor(self.bg_color)
                watercolor2.setAlpha(0) #150
            else:
                watercolor1 = QColor(self.bg_color)
                watercolor1.setAlpha(120 - (self.cunt +1 ) * 20)  # 100
                watercolor2 = QColor(self.bg_color)
                watercolor2.setAlpha(120 - (self.cunt +1 ) * 20)  # 150

        path = totalpath.intersected(water1)
        painter.setBrush(watercolor1)
        painter.drawPath(path)

        path = totalpath.intersected(water2)
        painter.setBrush(watercolor2)
        painter.drawPath(path)
        painter.restore()
        '''绘制字体'''
        m_font = QFont()
        m_font.setFamily('Microsoft YaHei')
        m_font.setPixelSize(int(self.width() / 7))
        painter.setPen(Qt.black)
        painter.setFont(m_font)
        if self.statuc:
            painter.drawText(self.rect(), Qt.AlignCenter, "Star")
        else:
            if self.per_num>=100:
                painter.drawText(self.rect(), Qt.AlignCenter, "Complate")
            else:
                painter.drawText(self.rect(), Qt.AlignCenter, "{}%".format(self.per_num))
        pen = QPen(QColor(int(153 - 1.53 * self.per_num),
                              int(217 - 0.55 * self.per_num),
                              int(234 - 0.02 * self.per_num)), 7)
        painter.setPen(pen)
        # painter.setPen(QColor(int(153 - 1.53 * self.per_num),
        #                       int(217 - 0.55 * self.per_num),
        #                       int(234 - 0.02 * self.per_num)),)  #
        # painter.setPen(self.pen)
        if self.statuc:
            painter.drawArc(rect, 0, 360 *16)
        else:
            if self.per_num>=100:
                painter.drawArc(rect, 0, 360 *16)
            else:
                painter.drawArc(rect, 90*16 - 57 * self.per_num , 57 * self.per_num)painter.end()

    # 鼠标进入处理
    def enterEvent(self, QEvent):
        self.setCursor(QCursor(Qt.PointingHandCursor))
        pass

    # 鼠标离开处理
    def leaveEvent(self, QEvent):
        self.setCursor(QCursor(Qt.ArrowCursor))
        pass

    # def mouseMoveEvent(self, event):
    #     s = event.windowPos()
    #     self.setMouseTracking(True)
    #     print(s.x(),s.y())
    def mousePressEvent(self, event):#标键按下时调用;
        if event.buttons() == Qt.LeftButton:  # 左键按下
            # print("单击鼠标左键")  # 响应测试语句
            if self.cunt==0:
                if self.statuc:
                    self.statuc = ~self.statuc
                    self.cunt = 6
                else:
                    if self.per_num >=100:
                        self.cunt = 6
                        self.per_num=0
                        self.statuc = ~self.statuc
        elif event.buttons() == Qt.RightButton:  # 右键按下
            # print("单击鼠标右键")  # 响应测试语句
            pass

    # def mouseReleaseEvent(self, event): # 鼠标键公开时调用;
    #     if event.button() == Qt.LeftButton:
    #         print("t单击鼠标左键")  # 响应测试语句
    #     elif event.button() == Qt.RightButton:  # 右键按下
    #         print("t单击鼠标右键")  # 响应测试语句

    def timerEvent(self, event):
    #
        self.per_num +=1
        if self.per_num >= 100:
            self.per_num = 100
        self.update()
    def setAngles(self, vale:int):
        if vale<0:
            self.per_num = 0
        elif vale>100:
            self.per_num = 100
        else:
            self.per_num = vale

#

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainwin = cirulars()
    mainwin.setWindowRole("20")
    mainwin.show()
    sys.exit(app.exec_())
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值