PyQt5渐变圆环水波进度条+透明淡入(多线程信号)
上效果:
![Deskto
文章目录
- | 导入模块
- | 效果
- 1.线程内修改界面
- 2. 窗口淡入(淡出)
- 3.窗口去边框
- 4.透明
- 5.圆环进度条实现
- 注意!!! ShareTechMomo不是本机字体(放上Consolas可以),自行下载!
- 6.水波进度条(正弦函数)
- 7.汇入Dialog
- | 全部代码
- 做这个出来肯定是有用的啊, 看看我下次怎么为后续`TCP server v2.0`夯实基础咯!
| 导入模块
import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * import math
| 效果
1.线程内修改界面
参考文章https://blog.csdn.net/avatarhhh/article/details/105540255
线程内修改, PyQt5提供了信号
PyQt5.QtCore.QThread
class ProgressThread(QThread):signal = pyqtSignal()def run(self):for p in range(100):self.signal.emit()self.msleep(100)
其实,如果不是准时设置, 你也可以不重写run函数, 直接调用signal.emit
方法即可
2. 窗口淡入(淡出)
参考文章https://blog.csdn.net/weixin_52132159/article/details/122549237…
直接写了个方法, 直接调用即可, anim类要绑定或保存在一个全局或类变量中, 在单独的函数结束中anim会直接执行__del__()方法
def Animation(parent, type=b"windowOpacity", from_value=0, to_value=1, ms=1000, connect=None):anim = QPropertyAnimation(parent, type)anim.setDuration(ms)anim.setStartValue(from_value)anim.setEndValue(to_value)if connect:anim.finished.connect(connect)anim.start()return anim
3.窗口去边框
self.setWindowFlags(Qt.FramelessWindowHint) # 去边框
4.透明
self.setAttribute(Qt.WA_TranslucentBackground) # 设置窗口背景透明
5.圆环进度条实现
注意!!! ShareTechMomo不是本机字体(放上Consolas可以),自行下载!
参考文章,在此基础上添加了不少东西https://blog.csdn.net/weixin_41611054/article/details/103660845
class RoundProgress(QWidget):m_waterOffset = 0.05m_offset = 50bg_color = QColor(255, 0, 0)fsize = 10def __init__(self, t, parent=None):super(RoundProgress, self).__init__(parent)self.resize(*t)self.size = tself.setWindowFlags(Qt.FramelessWindowHint) # 去边框self.setAttribute(Qt.WA_TranslucentBackground) # 设置窗口背景透明self.percent = 0self.pen = QPen()gradient = QConicalGradient(50, 50, 91)gradient.setColorAt(0, QColor(255, 10, 10))gradient.setColorAt(1, QColor(255, 201 ,14))#gradient.setColorAt(0.5, QColor(255, 201 ,14))self.pen.setBrush(gradient) # 设置画刷渐变效果self.pen.setWidth(8)self.pen.setCapStyle(Qt.RoundCap)self.font = QFont()self.font.setFamily("Consolas") #Share-TechMonoself.font.setPointSize(self.size[0] // 4)def paintEvent(self, event):width, height = self.sizerect = QRectF(self.fsize, self.fsize, width-self.fsize*2, height-self.fsize*2)painter = QPainter(self)rotateAngle = 360 * self.percent / 100# 绘制准备工作,启用反锯齿painter.setRenderHints(QPainter.Antialiasing)painter.setPen(self.pen)painter.drawArc(rect, (90 - 0) * 16, -rotateAngle * 16) # 画圆环painter.setFont(self.font)painter.setPen(QColor(153 - 1.53*self.percent ,217-0.55*self.percent,234-0.02*self.percent)) # r:255, g:201 - 10/100 * percent, b: 14-4 /100*percent 当前渐变painter.drawText(rect, Qt.AlignCenter, "%d%%" % self.percent ) # 显示进度条当前进度self.update()def update_percent(self, p):self.percent = p
Qpainter画弧
6.水波进度条(正弦函数)
参考文章 https://blog.csdn.net/weixin_42512684/article/details/105227816…, 主要是我把QPainterPath裁剪成了圆形.
class WaterProgress(QWidget):fsize = 10def __init__(self,t,parent=None):super(WaterProgress, self).__init__(parent)self.setWindowFlags(Qt.FramelessWindowHint) # 去边框self.setAttribute(Qt.WA_TranslucentBackground) # 设置窗口背景透明self.resize(*t)self.size = tself.layout = QGridLayout(self)#设置进度条颜色self.bg_color = QColor("#95BBFF")self.m_waterOffset = 0.005self.m_offset = 50self.m_borderwidth = 10self.percent = 0def paintEvent(self, event):painter = QPainter()painter.setRenderHint(QPainter.Antialiasing)painter.begin(self)painter.setPen(Qt.NoPen)#获取窗口的宽度和高度width,height = self.sizepercentage = 1 - self.percent/100# 水波走向:正弦函数 y = A(wx+l) + k# w 表示 周期,值越大密度越大w = 2 * math.pi / (width)# A 表示振幅 ,理解为水波的上下振幅A = height * self.m_waterOffset# k 表示 y 的偏移量,可理解为进度k = height *percentagewater1 = QPainterPath()water2 = QPainterPath()#起始点water1.moveTo(5,height)water2.moveTo(5,height)self.m_offset += 0.6if(self.m_offset >(width/2)):self.m_offset = 0i = 5rect = 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 ) + kwaterY2 = A*math.sin(w*i + self.m_offset + width/2*w) + kwater1.lineTo(i, waterY1)water2.lineTo(i, waterY2)i += 1water1.lineTo(width-5,height)water2.lineTo(width-5,height)totalpath = QPainterPath()#totalpath.addRect(rect)#painter.setBrush(Qt.gray)painter.drawRect(self.rect())painter.save()totalpath.addEllipse(rect)totalpath.intersected(water1)painter.setPen(Qt.NoPen)#设置水波的透明度watercolor1 =QColor(self.bg_color)watercolor1.setAlpha(100)watercolor2 = QColor(self.bg_color)watercolor2.setAlpha(150)path = totalpath.intersected(water1)painter.setBrush(watercolor1)painter.drawPath(path)path = totalpath.intersected(water2)painter.setBrush(watercolor2)painter.drawPath(path)painter.restore()painter.end()#self.update()def update_percent(self, p):self.percent = pif self.m_waterOffset < 0.05:self.m_waterOffset += 0.001return p
7.汇入Dialog
哈哈, 这里就没参考文章了.
class Progress(QDialog):percent = 0def __init__(self, text="",parent=None):super(Progress, self).__init__(parent)Font = QFont()Font.setFamily("Consolas")Font.setPointSize(12)self.setFont(Font)self.setWindowFlags(Qt.FramelessWindowHint) # 去边框self.setAttribute(Qt.WA_TranslucentBackground) # 设置窗口背景透明self.ProgressThread = ProgressThread()self.ProgressThread.signal.connect(self.percentUpdate)self.ProgressThread.start()width, height = 230, 230self.resize(width, height)self.water = WaterProgress((width, height), self)self.round = RoundProgress((width, height), self)self.label = QLabel(self)self.label.setText(QCoreApplication.translate("Dialog", text))print(self.label.width())self.label.move((width-self.label.width())/2, height/3*2)QMetaObject.connectSlotsByName(self)self.anim = Animation(self, )def connect(self, link):print(type(link))#self.setWindowFlags(Qt.WindowStaysOnTopHint) #置顶self.show()def percentUpdate(self):self.percent += 1self.water.update_percent(self.percent)self.water.paintEvent(None)self.round.update_percent(self.percent)
if __name__ == '__main__':app = QApplication(sys.argv)r = Progress("<a link='b'>write something</a>")r.show()sys.exit(app.exec_())
| 全部代码
一个个粘贴太麻烦了, 直接给你汇总了:
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import math
def Animation(parent, type=b"windowOpacity", from_value=0, to_value=1, ms=1000, connect=None):anim = QPropertyAnimation(parent, type)anim.setDuration(ms)anim.setStartValue(from_value)anim.setEndValue(to_value)if connect:anim.finished.connect(connect)anim.start()return anim
class ProgressThread(QThread):signal = pyqtSignal()def run(self):for p in range(100):self.signal.emit()self.msleep(100)
class RoundProgress(QWidget):m_waterOffset = 0.05m_offset = 50bg_color = QColor(255, 0, 0)fsize = 10def __init__(self, t, parent=None):super(RoundProgress, self).__init__(parent)self.resize(*t)self.size = tself.setWindowFlags(Qt.FramelessWindowHint) # 去边框self.setAttribute(Qt.WA_TranslucentBackground) # 设置窗口背景透明self.percent = 0self.pen = QPen()gradient = QConicalGradient(50, 50, 91)gradient.setColorAt(0, QColor(255, 10, 10))gradient.setColorAt(1, QColor(255, 201 ,14))#gradient.setColorAt(0.5, QColor(255, 201 ,14))self.pen.setBrush(gradient) # 设置画刷渐变效果self.pen.setWidth(8)self.pen.setCapStyle(Qt.RoundCap)self.font = QFont()self.font.setFamily("Share-TechMono") #Share-TechMonoself.font.setPointSize(self.size[0] // 4)def paintEvent(self, event):width, height = self.sizerect = QRectF(self.fsize, self.fsize, width-self.fsize*2, height-self.fsize*2)painter = QPainter(self)rotateAngle = 360 * self.percent / 100# 绘制准备工作,启用反锯齿painter.setRenderHints(QPainter.Antialiasing)painter.setPen(self.pen)painter.drawArc(rect, (90 - 0) * 16, -rotateAngle * 16) # 画圆环painter.setFont(self.font)painter.setPen(QColor(153 - 1.53*self.percent ,217-0.55*self.percent,234-0.02*self.percent)) # r:255, g:201 - 10/100 * percent, b: 14-4 /100*percent 当前渐变painter.drawText(rect, Qt.AlignCenter, "%d%%" % self.percent ) # 显示进度条当前进度self.update()def update_percent(self, p):self.percent = p
class WaterProgress(QWidget):fsize = 10def __init__(self,t,parent=None):super(WaterProgress, self).__init__(parent)self.setWindowFlags(Qt.FramelessWindowHint) # 去边框self.setAttribute(Qt.WA_TranslucentBackground) # 设置窗口背景透明self.resize(*t)self.size = tself.layout = QGridLayout(self)#设置进度条颜色self.bg_color = QColor("#95BBFF")self.m_waterOffset = 0.005self.m_offset = 50self.m_borderwidth = 10self.percent = 0def paintEvent(self, event):painter = QPainter()painter.setRenderHint(QPainter.Antialiasing)painter.begin(self)painter.setPen(Qt.NoPen)#获取窗口的宽度和高度width,height = self.sizepercentage = 1 - self.percent/100# 水波走向:正弦函数 y = A(wx+l) + k# w 表示 周期,值越大密度越大w = 2 * math.pi / (width)# A 表示振幅 ,理解为水波的上下振幅A = height * self.m_waterOffset# k 表示 y 的偏移量,可理解为进度k = height *percentagewater1 = QPainterPath()water2 = QPainterPath()#起始点water1.moveTo(5,height)water2.moveTo(5,height)self.m_offset += 0.6if(self.m_offset >(width/2)):self.m_offset = 0i = 5rect = 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 ) + kwaterY2 = A*math.sin(w*i + self.m_offset + width/2*w) + kwater1.lineTo(i, waterY1)water2.lineTo(i, waterY2)i += 1water1.lineTo(width-5,height)water2.lineTo(width-5,height)totalpath = QPainterPath()#totalpath.addRect(rect)#painter.setBrush(Qt.gray)painter.drawRect(self.rect())painter.save()totalpath.addEllipse(rect)totalpath.intersected(water1)painter.setPen(Qt.NoPen)#设置水波的透明度watercolor1 =QColor(self.bg_color)watercolor1.setAlpha(100)watercolor2 = QColor(self.bg_color)watercolor2.setAlpha(150)path = totalpath.intersected(water1)painter.setBrush(watercolor1)painter.drawPath(path)path = totalpath.intersected(water2)painter.setBrush(watercolor2)painter.drawPath(path)painter.restore()painter.end()#self.update()def update_percent(self, p):self.percent = pif self.m_waterOffset < 0.05:self.m_waterOffset += 0.001return p
class Progress(QDialog):percent = 0def __init__(self, text="",parent=None):super(Progress, self).__init__(parent)Font = QFont()Font.setFamily("Consolas")Font.setPointSize(12)self.setFont(Font)self.setWindowFlags(Qt.FramelessWindowHint) # 去边框self.setAttribute(Qt.WA_TranslucentBackground) # 设置窗口背景透明self.ProgressThread = ProgressThread()self.ProgressThread.signal.connect(self.percentUpdate)self.ProgressThread.start()width, height = 230, 230self.resize(width, height)self.water = WaterProgress((width, height), self)self.round = RoundProgress((width, height), self)self.label = QLabel(self)self.label.setText(QCoreApplication.translate("Dialog", text))print(self.label.width())self.label.move((width-self.label.width())/2, height/3*2)QMetaObject.connectSlotsByName(self)self.anim = Animation(self, )def connect(self, link):print(type(link))#self.setWindowFlags(Qt.WindowStaysOnTopHint) #置顶self.show()def percentUpdate(self):self.percent += 1self.water.update_percent(self.percent)self.water.paintEvent(None)self.round.update_percent(self.percent)
if __name__ == '__main__':app = QApplication(sys.argv)r = Progress("<a link='b'>write something</a>")r.show()sys.exit(app.exec_())
做这个出来肯定是有用的啊, 看看我下次怎么为后续TCP server v2.0
夯实基础咯!
PyQt5渐变圆环水波进度条+透明淡入(多线程信号)相关推荐
- java如何画百分比圆环_canvas绘制旋转的圆环百分比进度条
作者:依然 | 时间:2015-05-29 | 阅读:122 canvas绘制旋转的圆环百分比进度条 从上一篇的文章使用HTML5 Canvas arc()绘制圆形/圆环 我们了解到了怎么使用ca ...
- CSS锥形渐变实现环形进度条
10月份因为疫情原因.又开启了居家办公模式,空闲之余,与其选择"躺平",不如去做一些有意义的事情,内心的想法驱使着我去做些什么,但是又没有合适的素材,直到接手了最近的一个可视化项目 ...
- uni-app中自定义图表(canvas实现chart图表)开发篇(1)-圆环带进度条
经常开发中,会遇到各种各样图表,这时大家普遍会想到去找插件.uniapp中常用的有uchart.js和echart.js,这对图表要求不高的项目来说,是很便捷的.但有时会遇到一些定制图表,加上UI的美 ...
- Vue实战--动态圆环百分比进度条
最近在开发小程序的时候,碰到一个实现圆环百分比进度条的需求,类似如下设计图: 小白的我感觉实现起来有难度,于是上百度看看别人是怎么做的,结果没找到一个满意的,要不是静态的实现,就是需要用到比较多的 ...
- Android,水波进度条
一.前言 这个自定义控件并不是我写的,而是Github上的一个开源控件. 实现方式非常的巧妙,涉及到的知识也比较多点.现在我就来和大家分析一下实现原理. https://github.com/geli ...
- Qml水波进度条、扇形进度条等其他进度条
前言 分割线 正文 横线进度条 水波进度条 扇形进度条 前言 因为需求所致,需要采用进度条,开始采用的是普通的横线进度条,感觉效果也不错,后面改成了水波进度条,也就是好看了一点,在后面改成了扇形进度条 ...
- delphi fmx 跨平台水波进度条
在网上经常看到js,qt的水波进度条, 于是想fmx应该也可以实现的, 于是从qt翻译过来一个水波进度条 如下图 我没封装成控件,动态创建就好了, 对于球形的水波进度,我没处理好,路径搞不出来 代码如 ...
- iOS实现一个颜色渐变的弧形进度条
在Github上看到一些进度条的功能,都是通过Core Graph来实现.无所谓正确与否,但是开发效率明显就差很多了,而且运行效率还是值得考究的.其实使用苹果提供的Core Animation能够非常 ...
- ios弧形进度条_【iOS实现一个颜色渐变的弧形进度条】
在Github上看到一些进度条的功能,都是通过Core Graph来实现.无所谓正确与否,但是开发效率明显就差很多了,而且运行效率还是值得考究的.其实使用苹果提供的Core Animation能够非常 ...
- 【原】Github系列之三:开源iOS下 渐变颜色的进度条WGradientProgress
概述 今天我们来实现一个iOS平台上的进度条(progress bar or progress view).这种进度条比APPLE自带的更加漂亮,更加有"B格".它拥有渐变的颜色, ...
最新文章
- 自定义分辨率软件_苹果剪辑软件Final Cut Pro X导出竖屏视频教程
- 6.5 scp:远程文件复制
- 输出100以内所有的质数
- Sql语句查询某列A相同值的另一列B最大值的数据
- 诗词温习集:跟梁瀚文一起重温诗词(唐诗)之《春望》
- BERT: Pre-training of Deep Bidirectional Transformers forLanguage Understanding
- 反向代理服务器域名解析
- 用css使图片产生毛玻璃效果
- NISP二级证书换CISP证书是怎么回事?
- html的表单可以加背景图片,如何装饰表单的背景和字符
- WDK_基于Fabric的区块链系统开发
- 爬虫—dy直播各个类别下直播数据
- CSS 行内元素设置高度
- Diva-Tp项测试详解
- IE中不能自动选择UTF-8编码的解决办法
- 提升eBay店铺流量的方式有哪些?
- 抓包工具fiddler安装配置及使用教程
- 线性回归一些基本术语
- 最优停止问题 简单综述 2005年
- [ Android实战 ] java.lang.UnsatisfiedLinkError: No implementation found for xxx 问题解决