代码改变世界

pyqt5 动画学习(二) 改变控件颜色

2018-03-02 10:40  yongchin  阅读(7462)  评论(0编辑  收藏  举报

上一篇我们通过  self.anim = QPropertyAnimation(self.label, b"geometry")创建了一个动画,改变了空间的大小,这次我们来改变控件的颜色

但是label是没有color这个动画属性的,即设置  self.anim = QPropertyAnimation(self.label, b"color")是无效的

为此,我们要重写label类,赋予一个color属性,例如:

class MyLabel(QLabel):
    def __init__(self, text, para):
        super().__init__(text, para)

    def _set_color(self, col):
        self.setAutoFillBackground(True)
        palette = self.palette()
        palette.setColor(self.backgroundRole(), col)
        self.setPalette(palette)

    color = pyqtProperty(QColor, fset=_set_color)

还是通过调色板来改变label的颜色, 然后我们自定义一个名为"color"的属性

color = pyqtProperty(QColor, fset=_set_color)

定义以后我们就可以正常使用这个属性了,例如

self.anim = QPropertyAnimation(self.label, b"color")

 

下面是程式完整代码:

 

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
PyQt5 Animation tutorial

This program animates the color of a
widget with QPropertyAnimation.

Author: Seshigure 401219180@qq.com
Last edited: 2018.03.02
"""

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


class MyLabel(QLabel):
    def __init__(self, text, para):
        super().__init__(text, para)

    def _set_color(self, col):
        self.setAutoFillBackground(True)
        palette = self.palette()
        palette.setColor(self.backgroundRole(), col)
        self.setPalette(palette)

    color = pyqtProperty(QColor, fset=_set_color)


class Example(QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):
        self.button = QPushButton("Start", self)
        self.button.clicked.connect(self.doAnim)
        self.button.move(30, 30)

        self.label = MyLabel("changeColor", self)
        self.label._set_color(QColor(255, 50, 50, 50))
        self.label.setGeometry(150, 30, 100, 100)

        self.setGeometry(300, 300, 380, 300)
        self.setWindowTitle('Animation')
        self.show()

    def doAnim(self):
        self.anim = QPropertyAnimation(self.label, b"color")
        self.anim.setDuration(3000)
        self.anim.setStartValue(QColor(255, 50, 50, 50))  # 粉色 
        self.anim.setKeyValueAt(0.5, QColor(255, 0, 0, 250))  # 红色
        self.anim.setEndValue(QColor(255, 250, 50, 50))  # 米黄
        self.anim.start()


if __name__ == "__main__":
    app = QApplication([])
    ex = Example()
    ex.show()
    app.exec_()

 

 

 

 

界面预览图如下:

 

 

备注:

1、label没有color动画属性,所以我们得重写label

2、self.anim.setKeyValueAt(0.5, QColor(255, 0, 0, 250))这里使用了一个关键帧,让动画完成 粉色>红色>米黄的颜色转换