Использование процессора анимации цикла QVariantAnimation

#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) .