QPropertyAnimation не работает

Есть окно с виджетом QListView (1), в котором нужно иметь возможность развернуть при нажатии на кнопку (2). При этом, когда виджет QListView находится в развёрнутом состоянии, он должен скрывать три других виджета, находящиеся по ним (3, 4, 5).

У меня есть код анимации, который я скопировал с другой анимации в том же окне. При этом, все анимации выполняются одной и той же функцией, которая по аргументу widgetId определяет, что ей нужно делать. При попытке активировать анимацию кнопкой (привязанной к этой функции в другом модуле) абсолютно ничего не происходит. Что не так?

P. S. Я могу показать только код функции анимации, так как остальные модули слишком длинные (более 1К строк).

image

  1. functions.py
from AsQamm import *

class UIFunctions(MainWindow):

    # Функция toggleSimpleAnimation может быть использована для анимирования виджетов простой
    # линейной анимацией. Ей необходимо иметь следующие аргументы: желаемый максимальный размер
    # виджета (ширина/высота в зависимости от типа анимации) и ID виджета, с которым она будет
    # работать.

    def toggleSimpleAnimation(self, maxLength, widgetId):

        maxExtend = int()

        if widgetId == 1: # проверяем аргумент на 1 вариант. Эта анимация работает!

            # получаем ширину фрейма 
            width = self.ui.frame_left_menu.width()
            maxExtend = maxLength
            standard = 60

            # установим максимальное значение ширины фрейма
            if width == 60:
                lengthExtended = maxExtend
            else:
                lengthExtended = standard

            # выполним горизонтальную анимацию
            self.animation = QPropertyAnimation(self.ui.frame_left_menu, b"minimumWidth")
            self.animation.setDuration(200)
            self.animation.setStartValue(width)
            self.animation.setEndValue(lengthExtended)
            self.animation.setEasingCurve(QtCore.QEasingCurve.InOutQuart)
            self.animation.start() 

        elif widgetId == 2: # проверяем второй вариант. Эта анимация не работает!

            height = self.ui.tbv_DefnCamList.height()
            maxExtend == maxLength
            standard = 40

            # установим максимальное значение высоты фрейма и скроем/отобразим мешающие
            # элементы
            if height == 40:
                lengthExtended = maxExtend
                self.ui.lbl_DefnCurrSetCamId.hide()
                self.ui.lbl_ReadOnly10.hide()
                self.ui.gvf_DefnCamView.hide()

            else:
                lengthExtended = standard
                self.ui.lbl_DefnCurrSetCamId.show()
                self.ui.lbl_ReadOnly10.show()
                self.ui.gvf_DefnCamView.show()
            
            # выполним вертикальную анимацию

            self.animation = QPropertyAnimation(self.ui.tbv_DefnCamList, b'minimumHeight')
            self.animation.setDuration(200)
            self.animation.setStartValue(height)
            self.animation.setEndValue(lengthExtended)
            self.animation.setEasingCurve(QtCore.QEasingCurve.InOutQuart)
            self.animation.start()


  1. AsQamm.py (сокращён)
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

from _asQamm import *
from _asQamm.asQammUI import Ui_MainWindow
from _asQamm.resources import *
from _asQamm.functions import *


class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.ui.btn_Toggle.clicked.connect(lambda: UIFunctions.toggleSimpleAnimationBox(self, 190, 1))
        self.ui.btn_DefnToggleCamList.clicked.connect(lambda: UIFunctions.toggleSimpleAnimationBox(self, 320, 2))


if __name__ == "__main__":
    app = QApplication(sys.argv)
    root = MainWindow()
    root.show()
    sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: S. Nick

Если вы хотите получать быстрые и правильные ответы, вы должны научиться составлять минимальный воспроизводимый пример (МВП). МВП должен демонстрировать только ту проблему, с которой вы столкнулись.

В задаваемом вопросе рекомендовано рассматривать ОДНУ проблему.

Я набросал пародию на ваш дизайн и покажу вам вариант как описанные вами действию можно реализовать по нажатию на Кнопка 2.

Выполните

pyuic5 q1160543_ui.ui -o q1160543_ui.py

Запустите main.py и сделайте несколько кликов по Кнопка 2

main.py

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

from q1160543_ui import Ui_MainWindow

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()

        self.setupUi(self)
        
        self.item_list = ['item %s' % i for i in range(33)]   
        self.model = QStringListModel(self)
        self.model.setStringList(self.item_list)
        self.listView.setModel(self.model)

        self.pushButton.setCheckable(True)
        self.pushButton.toggled.connect(self.on_off_button_1)
        
    def on_off_button_1(self, state):
        if state:
            self.label_2.hide()
            self.label_3.hide()
            self.label_4.hide()
        else:
            self.label_2.show()
            self.label_3.show()
            self.label_4.show()    
        

if __name__ == "__main__":
    app = QApplication(sys.argv)
    root = MainWindow()
    root.show()
    sys.exit(app.exec_())

q1160543_ui.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>510</width>
    <height>466</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout_2">
    <item row="0" column="0">
     <layout class="QGridLayout" name="gridLayout">
      <item row="0" column="2">
       <widget class="QComboBox" name="comboBox">
        <item>
         <property name="text">
          <string>(все зоны)</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>New Item</string>
         </property>
        </item>
       </widget>
      </item>
      <item row="0" column="0">
       <widget class="QPushButton" name="pushButton">
        <property name="text">
         <string>Кнопка 2</string>
        </property>
       </widget>
      </item>
      <item row="0" column="1">
       <widget class="QLabel" name="label">
        <property name="text">
         <string>Зоны:</string>
        </property>
        <property name="alignment">
         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
        </property>
       </widget>
      </item>
      <item row="1" column="0" colspan="3">
       <widget class="QListView" name="listView"/>
      </item>
      <item row="2" column="0">
       <widget class="QLabel" name="label_2">
        <property name="text">
         <string>Выбрана камера:</string>
        </property>
       </widget>
      </item>
      <item row="2" column="2">
       <widget class="QLabel" name="label_3">
        <property name="text">
         <string>(нет)</string>
        </property>
        <property name="alignment">
         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
        </property>
       </widget>
      </item>
      <item row="3" column="0" colspan="3">
       <widget class="QLabel" name="label_4">
        <property name="minimumSize">
         <size>
          <width>0</width>
          <height>300</height>
         </size>
        </property>
        <property name="font">
         <font>
          <pointsize>22</pointsize>
         </font>
        </property>
        <property name="styleSheet">
         <string notr="true">background-color: rgb(0, 255, 255);</string>
        </property>
        <property name="text">
         <string>5</string>
        </property>
        <property name="alignment">
         <set>Qt::AlignCenter</set>
        </property>
       </widget>
      </item>
      <item row="4" column="0" colspan="3">
       <widget class="QPushButton" name="pushButton_2">
        <property name="text">
         <string>Архив записей камеры</string>
        </property>
       </widget>
      </item>
     </layout>
    </item>
   </layout>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

введите сюда описание изображения

→ Ссылка