我想实现闪光功能。背景颜色应该改变为新的,然后顺利返回。
我确实喜欢这样:
from IPython.external.qt_for_kernel import QtGui
from PyQt5.QtGui import QColor, QBrush
from PyQt5.QtWidgets import *
import sys
from copy import copy, deepcopy
from classes.statistics import Statistics
from PyQt5.QtCore import QTimer, Qt
class MainWindow(QMainWindow):
def __init__(self, width=900, height=900, font_size=20, input_size=(25, 30), background_color=[60, 170, 255],
red=[255, 0, 0], green=[0, 255, 0]):
super().__init__()
self.width, self.height = width, height
self.resize(width, height)
self.background_color = background_color
self.red = red
self.green = green
self.setupUi()
def flash(self, start_color, time=5000, step=100):
steps = [(self.background_color[i] - start_color[i]) / time * step for i in range(3)]
print('steps =', steps)
current_color = copy(start_color)
for i in range(0, time, step):
QTimer.singleShot(i, lambda: self.set_color(copy(current_color)))
print(f'{i} ms before {current_color}')
for i in range(3):
current_color[i] += steps[i]
def red_flash(self, time=5000, step=100):
self.flash(self.red, time=time, step=step)
def green_flash(self, time=5000, step=100):
self.flash(self.green, time=time, step=step)
def set_color(self, color):
print('setting color', color)
self.palette.setColor(QtGui.QPalette.Background, QColor(*color))
self.setPalette(self.palette)
self.show()
def setupUi(self):
self.palette = QtGui.QPalette()
self.palette.setColor(QtGui.QPalette.Background, QColor("#99ccff"))
self.setPalette(self.palette)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
w.show()
w.red_flash()
sys.exit(app.exec_())
如果您查看程序的输出:
0 ms before [255, 0, 0]
100 ms before [190.0, 56.666666666666664, 85.0]
200 ms before [125.0, 113.33333333333333, 170.0]
setting color [60.0, 170.0, 255.0]
setting color [60.0, 170.0, 255.0]
setting color [60.0, 170.0, 255.0]
你可以看到函数被调用了几次set_color,颜色不同,但是当函数开始运行时,每次都使用相同的颜色。
可能是什么问题呢?
也许我选择了错误的方法来实现这个想法,还有另一种更正确的方法吗?
该类为
QPropertyAnimationQt 属性设置动画。更多... https://doc.qt.io/qt-5/qpropertyanimation.html