Запаздывающая анимация QProgressBar с текстовым форматом без %v ⇐ Python
-
Гость
Запаздывающая анимация QProgressBar с текстовым форматом без %v
Я хочу анимировать изменение значения QProgressBar. Я не нашел лучшего решения, чем просто умножить все значения, например, на 1000, а затем анимировать переход. Например, если я хочу изменить значение с 5 на 4, анимация индикатора выполнения меняет значение с 5000 на 4000, но вместо 5000 и 4000 отображаются числа 5 и 4. Вот как я это реализовал:
класс CustomProgressBar(QWidget): def __init__(self, родитель, curr_value: интервал, максимальное_значение: целое): super().__init__(родитель=родитель) self.MULTIPLIER = 1000 макет = QVBoxLayout (сам) self.progress_bar = self.pg = QProgressBar(self) self.progress_bar.setTextVisible(True) self.progress_bar.setAlignment(Qt.AlignmentFlag.AlignCenter) self.progress_bar.setFixedSize(QSize(1000, 100)) self.progress_bar.setMaximum(max_value * self.MULTIPLIER) self.progress_bar.setValue(curr_value * self.MULTIPLIER) display_value = int(self.pg.value() / self.MULTIPLIER) display_max_value = int(self.pg.maximum() / self.MULTIPLIER) self.progress_bar.setFormat(f"{displayed_value}/{displayed_max_value}") макет.addWidget(self.progress_bar) # Анимация self.animation = QPropertyAnimation(self.progress_bar, b"value", self.progress_bar) self.animation.setDuration(500) self.animation.setEasingCurve(QEasingCurve.Type.OutCubic) защита set_value(self, new_value): новое_значение = новое_значение * self.MULTIPLIER, если новое_значение > 0, иначе 0 self.animate_value_change(новое_значение) display_new_value = int(new_value/self.MULTIPLIER) display_max_value = int(self.pg.maximum() / self.MULTIPLIER) self.progress_bar.setFormat(f"{displayed_new_value}/{displayed_max_value}") Защиту animate_value_change(self, new_value): """Анимация изменения значения""" # изменение цвета текста если new_value 0 еще 0 self.animate_value_change(новое_значение) display_new_value = int(new_value/self.MULTIPLIER) display_max_value = int(self.pg.maximum() / self.MULTIPLIER) self.progress_bar.setFormat(f"{displayed_new_value}/{displayed_max_value}") Защиту animate_value_change(self, new_value): """Анимация изменения значения""" # изменение цвета текста если new_value int: вернуть self._value @value.setter значение def (self, значение: int): self._value = значение, если значение >= 0, иначе 0 self.value_changed.emit(self.value) защита make_step (сам): self.value -= self.step процесс def (self, задержка: int | float): время.сон(3) значение_по умолчанию = само.значение пока правда: в то время как self.value: self.make_step() time.sleep(задержка) self.value = значение_по умолчанию time.sleep(задержка) def run(self, задержка: int | float = 1): Thread(target=self.process, args=(delay, ), daemon=True).start() если __name__ == "__main__": приложение = QApplication() виджет = QWidget() макет = QVBoxLayout (виджет) счетчик = МойСчетчик(30, 4) Progress_bar = CustomProgressBar (виджет, 30, 30) counter.value_changed.connect(progress_bar.set_value) макет.addWidget(progress_bar) виджет.шоу() счетчик.run(1) приложение.exec()
Я хочу анимировать изменение значения QProgressBar. Я не нашел лучшего решения, чем просто умножить все значения, например, на 1000, а затем анимировать переход. Например, если я хочу изменить значение с 5 на 4, анимация индикатора выполнения меняет значение с 5000 на 4000, но вместо 5000 и 4000 отображаются числа 5 и 4. Вот как я это реализовал:
класс CustomProgressBar(QWidget): def __init__(self, родитель, curr_value: интервал, максимальное_значение: целое): super().__init__(родитель=родитель) self.MULTIPLIER = 1000 макет = QVBoxLayout (сам) self.progress_bar = self.pg = QProgressBar(self) self.progress_bar.setTextVisible(True) self.progress_bar.setAlignment(Qt.AlignmentFlag.AlignCenter) self.progress_bar.setFixedSize(QSize(1000, 100)) self.progress_bar.setMaximum(max_value * self.MULTIPLIER) self.progress_bar.setValue(curr_value * self.MULTIPLIER) display_value = int(self.pg.value() / self.MULTIPLIER) display_max_value = int(self.pg.maximum() / self.MULTIPLIER) self.progress_bar.setFormat(f"{displayed_value}/{displayed_max_value}") макет.addWidget(self.progress_bar) # Анимация self.animation = QPropertyAnimation(self.progress_bar, b"value", self.progress_bar) self.animation.setDuration(500) self.animation.setEasingCurve(QEasingCurve.Type.OutCubic) защита set_value(self, new_value): новое_значение = новое_значение * self.MULTIPLIER, если новое_значение > 0, иначе 0 self.animate_value_change(новое_значение) display_new_value = int(new_value/self.MULTIPLIER) display_max_value = int(self.pg.maximum() / self.MULTIPLIER) self.progress_bar.setFormat(f"{displayed_new_value}/{displayed_max_value}") Защиту animate_value_change(self, new_value): """Анимация изменения значения""" # изменение цвета текста если new_value 0 еще 0 self.animate_value_change(новое_значение) display_new_value = int(new_value/self.MULTIPLIER) display_max_value = int(self.pg.maximum() / self.MULTIPLIER) self.progress_bar.setFormat(f"{displayed_new_value}/{displayed_max_value}") Защиту animate_value_change(self, new_value): """Анимация изменения значения""" # изменение цвета текста если new_value int: вернуть self._value @value.setter значение def (self, значение: int): self._value = значение, если значение >= 0, иначе 0 self.value_changed.emit(self.value) защита make_step (сам): self.value -= self.step процесс def (self, задержка: int | float): время.сон(3) значение_по умолчанию = само.значение пока правда: в то время как self.value: self.make_step() time.sleep(задержка) self.value = значение_по умолчанию time.sleep(задержка) def run(self, задержка: int | float = 1): Thread(target=self.process, args=(delay, ), daemon=True).start() если __name__ == "__main__": приложение = QApplication() виджет = QWidget() макет = QVBoxLayout (виджет) счетчик = МойСчетчик(30, 4) Progress_bar = CustomProgressBar (виджет, 30, 30) counter.value_changed.connect(progress_bar.set_value) макет.addWidget(progress_bar) виджет.шоу() счетчик.run(1) приложение.exec()
Мобильная версия