Pyqt5实现圆形计时器(进度条)效果

使用Pyqt5实现圆形计时器(进度条)的效果,支持用户自行输入倒计时时间,界面美观,可以自行修改进度条的颜色

1、支持用户自行输入倒计时时间,对应waittime

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = CircularProgressBar(waittime=20)
    window.show()
    sys.exit(app.exec_())

2、如果想要在界面中调用,只需要调用CircularProgressBar这个类即可

3、支持自行修改倒计时容器的背景色和进度调色,对应几处QColor

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.RenderHint.Antialiasing)

        rect = self.rect()
        rect.adjust(20, 20, -20, -20)
        center = rect.center()

        # 画背景圆
        painter.setPen(QPen(QColor(209, 213, 220), 20))
        painter.drawEllipse(rect)

        # 画进度圆(带弧度)
        angle = int(360 * (self.progress / self.waittime))  # 将angle转换为整数

        # 创建带有圆角的QPen
        pen = QPen(QColor(52, 110, 231), 20)
        pen.setCapStyle(Qt.PenCapStyle.RoundCap)  # 设置Pen的Cap Style为圆角

        painter.setPen(pen)

        # 计算圆弧的起始角度和角度范围
        start_angle = 90 * 16  # 从12点钟方向开始
        span_angle = -angle * 16  # 负角度表示逆时针方向

        painter.drawArc(rect, start_angle, span_angle)

5、下面附上我的完整代码,只要环境没问题都可以直接运行了

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtGui import QPainter, QColor,  QFont, QPen


class CircularProgressBar(QWidget):
    def __init__(self, waittime):
        super().__init__()
        self.waittime = waittime  # 使用传入的waittime参数
        self.initUI()

    def initUI(self):
        self.setGeometry(100, 100, 360, 360)
        self.setWindowTitle('圆形倒计时')

        self.progress = 0
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.updateProgress)

        self.remaining_time = self.waittime  # 将等待时间设置为初始值
        self.remaining_label = QLabel(self)
        self.remaining_label.setFont(QFont("Arial", 48))
        self.remaining_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.remaining_label.setGeometry(80, 80, 200, 200)

        self.is_running = False  # 标记进度条是否正在运行
        self.progressnum = 0

        # 启动定时器
        self.startProgress()

    def updateProgress(self):
        self.progress += 1
        if self.progress > self.waittime:  # 设置进度条时间为5秒
            self.progress = 0
        self.remaining_time -= 1
        if self.remaining_time < 0:
            self.remaining_time = 0
            self.timer.stop()
            self.is_running = False
        self.remaining_label.setText(f"{self.remaining_time}")

        self.update()

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.RenderHint.Antialiasing)

        rect = self.rect()
        rect.adjust(20, 20, -20, -20)
        center = rect.center()

        # 画背景圆
        painter.setPen(QPen(QColor(209, 213, 220), 20))
        painter.drawEllipse(rect)

        # 画进度圆(带弧度)
        angle = int(360 * (self.progress / self.waittime))  # 将angle转换为整数

        # 创建带有圆角的QPen
        pen = QPen(QColor(52, 110, 231), 20)
        pen.setCapStyle(Qt.PenCapStyle.RoundCap)  # 设置Pen的Cap Style为圆角

        painter.setPen(pen)

        # 计算圆弧的起始角度和角度范围
        start_angle = 90 * 16  # 从12点钟方向开始
        span_angle = -angle * 16  # 负角度表示逆时针方向

        painter.drawArc(rect, start_angle, span_angle)

    def startProgress(self):
        if not self.is_running:
            self.timer.start(1000)
            self.is_running = True


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = CircularProgressBar(waittime=20)
    window.show()
    sys.exit(app.exec_())

做这个容器的原因是之前有客人想要实现这个功能,当时做的是一个训练倒计时的效果,那个时候在网上查找了很多资料都没有一个很好的案例,所以自己写了一个,后来发现其实QFluentWidgets的ProgressRing也可以实现这样的圆形进度条的效果,但是这个是一个写好的容器,可变性相对于没有那么好,各有优劣,我写的这个就可变性好一点咯,可以容我对这个容器的内容显示效果做修改(但是如果我一早发现了我就直接用了😂)

想要了解更多的pyqt5界面效果可以关注我,应该后面也会持续更新的

  • 13
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值