使用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界面效果可以关注我,应该后面也会持续更新的