pythonpython-3.xpyqtpyqt5qpropertyanimation

Why the QPropertyAnimation animation does not work?


I'm trying to generate an animation when I press a button, but it does not work after the self.frame2 returns to size 0:

this is an example:

enter image description here

After the frame returns to 0 the animation is not done again:

from PyQt5.QtWidgets import QMainWindow,QApplication
from PyQt5 import QtCore
from PyQt5 import uic


class Login(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        uic.loadUi("1.-Login.ui",self)

        #Apariencia de Ventana
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        self.setAttribute(QtCore.Qt.WA_NoSystemBackground,True)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground, True)

        #Botones
        self.Ajustes.clicked.connect(self.animaAjustes)


        self.ComboSuc.lineEdit().setAlignment(QtCore.Qt.AlignCenter)



        self.animation = QtCore.QPropertyAnimation(self.frame2, b'size', self)
        self.animation.setStartValue(QtCore.QSize(0,0))
        self.animation.setEndValue(QtCore.QSize(145,443))
        self.animation.setDuration(200)
        self.animation.setDirection(QtCore.QAbstractAnimation.Forward)




    def animaAjustes(self):

        if self.frame2.width()!=0:
            self.frame2.setGeometry(0,0,0,0)

        else:

            self.animation.start()



app = QApplication([])
l = Login()
l.show()
app.exec_()

file.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>606</width>
    <height>430</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <property name="styleSheet">
   <string notr="true">background:qlineargradient(spread:pad, x1:0.565, y1:0, x2:0.508475, y2:1, stop:0 rgba(0, 0, 103, 0), stop:1 rgba(255, 255, 255, 0));</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <property name="styleSheet">
    <string notr="true">background:qlineargradient(spread:pad, x1:0.565, y1:0, x2:0.508475, y2:1, stop:0 rgba(0, 0, 103, 0), stop:1 rgba(255, 255, 255, 0));</string>
   </property>
   <widget class="QFrame" name="frame1">
    <property name="geometry">
     <rect>
      <x>0</x>
      <y>-10</y>
      <width>481</width>
      <height>441</height>
     </rect>
    </property>
    <property name="styleSheet">
     <string notr="true">
QFrame#frame1{
background:White;
border:0px;

}</string>
    </property>
    <property name="frameShape">
     <enum>QFrame::StyledPanel</enum>
    </property>
    <property name="frameShadow">
     <enum>QFrame::Raised</enum>
    </property>
    <widget class="QFrame" name="frame3">
     <property name="geometry">
      <rect>
       <x>120</x>
       <y>50</y>
       <width>250</width>
       <height>120</height>
      </rect>
     </property>
     <property name="styleSheet">
      <string notr="true">background-image:url(src/Logo.png);
background-position:center;
background-repeat:none;</string>
     </property>
     <property name="frameShape">
      <enum>QFrame::StyledPanel</enum>
     </property>
     <property name="frameShadow">
      <enum>QFrame::Raised</enum>
     </property>
    </widget>
    <widget class="QPushButton" name="Ajustes">
     <property name="geometry">
      <rect>
       <x>450</x>
       <y>35</y>
       <width>31</width>
       <height>23</height>
      </rect>
     </property>
     <property name="styleSheet">
      <string notr="true">QPushButton#Ajustes{
border:0px;
background:none;
}</string>
     </property>
     <property name="text">
      <string/>
     </property>
     <property name="icon">
      <iconset>
       <normaloff>src/Icons/icons8-settings.png</normaloff>src/Icons/icons8-settings.png</iconset>
     </property>
    </widget>
    <widget class="QPushButton" name="Entrar">
     <property name="geometry">
      <rect>
       <x>200</x>
       <y>260</y>
       <width>81</width>
       <height>23</height>
      </rect>
     </property>
     <property name="styleSheet">
      <string notr="true">QPushButton#Entrar{
background:qlineargradient(spread:pad, x1:0.514, y1:0, x2:0.508475, y2:1, stop:0 rgba(0, 170, 213, 255), stop:1 rgba(19, 12, 64, 255));
color:white;
}
QPushButton#Entrar:pressed{
background:qlineargradient(spread:pad, x1:0.514, y1:0, x2:0.508475, y2:1, stop:0 rgba(19, 12, 64, 255), stop:0.994318 rgba(0, 170, 213, 255));
}

</string>
     </property>
     <property name="text">
      <string>Entrar</string>
     </property>
    </widget>
    <widget class="QLabel" name="LabelSuc">
     <property name="geometry">
      <rect>
       <x>190</x>
       <y>220</y>
       <width>101</width>
       <height>20</height>
      </rect>
     </property>
     <property name="font">
      <font>
       <pointsize>9</pointsize>
       <weight>50</weight>
       <bold>false</bold>
      </font>
     </property>
     <property name="styleSheet">
      <string notr="true">QLabel#LabelSuc{
border-bottom:1px solid qlineargradient(spread:pad, x1:0.983051, y1:0.608, x2:0, y2:0.585, stop:0 rgba(255, 255, 255, 0), stop:0.497175 rgba(16, 102, 214, 121), stop:1 rgba(255, 255, 255, 0));
color:#1687A1
}</string>
     </property>
     <property name="text">
      <string>Sucusal</string>
     </property>
     <property name="alignment">
      <set>Qt::AlignCenter</set>
     </property>
    </widget>
    <widget class="QFrame" name="frame">
     <property name="geometry">
      <rect>
       <x>0</x>
       <y>10</y>
       <width>481</width>
       <height>21</height>
      </rect>
     </property>
     <property name="styleSheet">
      <string notr="true">background:#0584B1;</string>
     </property>
     <property name="frameShape">
      <enum>QFrame::StyledPanel</enum>
     </property>
     <property name="frameShadow">
      <enum>QFrame::Raised</enum>
     </property>
     <widget class="QPushButton" name="BotonClose">
      <property name="geometry">
       <rect>
        <x>456</x>
        <y>-2</y>
        <width>21</width>
        <height>21</height>
       </rect>
      </property>
      <property name="font">
       <font>
        <pointsize>10</pointsize>
        <weight>75</weight>
        <bold>true</bold>
       </font>
      </property>
      <property name="styleSheet">
       <string notr="true">QPushButton#BotonClose{
border:0px;
background:none;
color:white;
}</string>
      </property>
      <property name="text">
       <string>X</string>
      </property>
     </widget>
     <widget class="QLabel" name="label_2">
      <property name="geometry">
       <rect>
        <x>2</x>
        <y>1</y>
        <width>151</width>
        <height>16</height>
       </rect>
      </property>
      <property name="styleSheet">
       <string notr="true">color:white;</string>
      </property>
      <property name="text">
       <string>Exxe-Ventas v3.0 2019.01.01</string>
      </property>
     </widget>
    </widget>
    <widget class="QLabel" name="LabelStatus">
     <property name="geometry">
      <rect>
       <x>0</x>
       <y>424</y>
       <width>481</width>
       <height>16</height>
      </rect>
     </property>
     <property name="styleSheet">
      <string notr="true">color:white;
background:qlineargradient(spread:pad, x1:1, y1:0.545, x2:0, y2:0.585, stop:0 rgba(184, 21, 21, 57), stop:0.487 rgba(182, 27, 13, 186), stop:1 rgba(184, 21, 21, 57));</string>
     </property>
     <property name="text">
      <string> Satus: Sin Conexion</string>
     </property>
     <property name="alignment">
      <set>Qt::AlignCenter</set>
     </property>
    </widget>
   </widget>
   <widget class="QFrame" name="frame2">
    <property name="geometry">
     <rect>
      <x>480</x>
      <y>0</y>
      <width>0</width>
      <height>443</height>
     </rect>
    </property>
    <property name="styleSheet">
     <string notr="true">QFrame#frame2{
border:0px;
border:2px solid grey;
background:white;
}</string>
    </property>
    <property name="frameShape">
     <enum>QFrame::StyledPanel</enum>
    </property>
    <property name="frameShadow">
     <enum>QFrame::Raised</enum>
    </property>
    <widget class="QLabel" name="label">
     <property name="geometry">
      <rect>
       <x>-3</x>
       <y>0</y>
       <width>141</width>
       <height>21</height>
      </rect>
     </property>
     <property name="styleSheet">
      <string notr="true">background:#0584B1;
color:white;</string>
     </property>
     <property name="text">
      <string>ConfiguraciĆ³n</string>
     </property>
     <property name="alignment">
      <set>Qt::AlignCenter</set>
     </property>
    </widget>
    <widget class="QLabel" name="label_3">
     <property name="geometry">
      <rect>
       <x>30</x>
       <y>30</y>
       <width>61</width>
       <height>16</height>
      </rect>
     </property>
     <property name="styleSheet">
      <string notr="true">color:grey;</string>
     </property>
     <property name="text">
      <string>Sucursal:</string>
     </property>
     <property name="alignment">
      <set>Qt::AlignCenter</set>
     </property>
    </widget>
    <widget class="QComboBox" name="ComboSuc">
     <property name="geometry">
      <rect>
       <x>30</x>
       <y>60</y>
       <width>69</width>
       <height>22</height>
      </rect>
     </property>
     <property name="styleSheet">
      <string notr="true">QComboBox#ComboSuc{
background:none;
border:0px;
border-bottom: 1px solid lightblue;
color:#05839C;
}


QComboBox QAbstractItemView
{
    border:0px;
    background:white;
    color: grey;

}
QComboBox#ComboSuc::drop-down
{
     subcontrol-origin: padding;
     subcontrol-position: top right;
     width: 15px;
     color: white;
     border-left-width: 0px;
     border-left-color: darkgray;
     border-left-style: solid; /* just a single line */
     border-top-right-radius: 3px; /* same radius as the QComboBox */
     border-bottom-right-radius: 3px;
     padding-left: 10px;
 }</string>
     </property>
     <property name="editable">
      <bool>true</bool>
     </property>
     <item>
      <property name="text">
       <string>Exxe 1</string>
      </property>
     </item>
     <item>
      <property name="text">
       <string>Exxe 3</string>
      </property>
     </item>
    </widget>
   </widget>
   <zorder>frame2</zorder>
   <zorder>frame1</zorder>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

Solution

  • The geometry is the position of the widget with respect to the parent, in the initial case the geometry is (480, 0, 0, 443), that is, it has width 0 but it is on the right edge of frame1 and after it is set to geometry (0 , 0, 0, 0) you move it to the upper left position of the window and there the animation is applied but you do not see why it is behind frame1.

    To better observe the error, use raise_ so that the frame is on top of all of them.

    def animaAjustes(self):
        if self.frame2.width() != 0:
            self.frame2.setGeometry(0, 0, 0, 0)
        else:
            self.frame2.raise_() # <--- this change will make the error visible
            self.animation.start()
    

    The solution is only to change the size, not the geometry (the geometry is position + size):

    def animaAjustes(self):
        if self.frame2.width() > 0:
            self.frame2.resize(0, 0)
        else:
            self.animation.start()