#python #pyside #pyside6 #qvariantanimation
Вопрос:
Я пытаюсь анимировать фон кадра в цикле, чтобы он менялся с color1 на color2, на color1 и т.д.
Вот что у меня есть до сих пор, что работает, но оно потребляет 2-3% моего процессора, чего, я думаю, не должно быть:
class MyWindow(QtWidgets.QDialog):
def __init__(self):
super(MyWindow, self).__init__()
self.ui = Ui_MyDialog()
self.ui.setupUi(self)
self._animation = QVariantAnimation(self.ui.frame)
self._animation.setDirection(QAbstractAnimation.Forward)
self._animation.setEndValue(QColor(55, 25, 99))
self._animation.setStartValue(QColor(120, 214, 159))
self._animation.setDuration(1000)
self._animation.valueChanged.connect(self._animate)
self.animate_timer = QTimer()
self.animate_timer.setInterval(1000)
self.animate_timer.timeout.connect(self.add_animation)
def add_animation(self):
if self._animation.direction() == QAbstractAnimation.Forward:
self._animation.setDirection(QAbstractAnimation.Backward)
else:
self._animation.setDirection(QAbstractAnimation.Forward)
self._animation.start()
def _animate(self, color):
qss = "QWidget#frame {background-color: " color.name() ";}"
self.ui.frame.setStyleSheet(qss)
Я считаю, что должен быть более элегантный способ, который не приведет к такой загрузке процессора, но я не мог понять. Проблема в том, что у меня довольно высокопроизводительный процессор, и если он будет работать на 2-3% на этом процессоре, это приведет к увеличению на некоторых более медленных процессорах, где мы запустим эту программу. Если я не буду делать анимацию, то это 0%.
Комментарии:
1. То, что вы говорите, странно, каковы характеристики вашей машины? Какова ваша операционная система?
2. Windows 10, i7-7820X, 32 ГБ оперативной памяти, и я запускаю приложение в PyCharm. Я все еще не уверен, будет ли это лучшим способом запустить анимацию цикла с помощью этого таймера и запускать ее каждую секунду назад или вперед, это была просто быстрая идея. Меня бы не волновали эти 1-2%, но я знаю, что он будет работать на гораздо более медленных компьютерах, поэтому мне нужно что-то придумать.
3. Вы пробовали запускать его не из pycharm, а из cmd?
4. Это то же самое, однако я заметил, что если я изменю продолжительность анимации примерно на 500 мс, а таймер-на 1000 мс, то процессор теперь составляет около 0,5%. Возможно, анимация еще не закончена, но таймер запускает ее снова, так как они имели одинаковую продолжительность (1 сек). Если я установлю продолжительность анимации на 900 мс, чтобы сделать переход более плавным, она составит 1% процессора, странно. Есть идеи, как сделать его циклическим без таймера, который может перекрывать анимацию?
5. @ZoltanSzabo Я вижу ~2%, но у меня старый i5-3570K (linux). Внимание: 1. постоянное обновление стилей требует определенного времени, особенно если виджет имеет много детей, что бы в конце концов проверить, если изменение стилей родительского влияет на них; 2. если вы только хотите переопределить цвет фона фрейма, вы можете использовать подкласс (по пропаганде виджет) и в итоге нарисовать фон самостоятельно путем переопределения
paintEvent()
(вы могли бы рассмотреть вопрос о создании палитрыWindow
роль, правда); 3. для непрерывного цикла, используютself._animation.finished.connect(self.add_animation)
.