Не получается выдвинуть виджет наведением курсора PyQt5

Начал недавно изучать Python и PyQt5, пытаюсь создать выдвигающийся виджет при наведении на него курсора, однако мне выдают ошибку

TypeError: __init__() missing 1 required positional argument: 'self' 

и я не понимаю, что с ней делать.

from PyQt5 import QtCore, QtWidgets, QtGui  

class gg( object):
    def setup(self, MainWindow):
        MainWindow.objectName('ОКОШЕЧКО')
        MainWindow.resize(850, 500)
        self.widget = QtWidgets.QtWidgets(MainWindow)
        self.widget.setStileSheet('')
        self.widget.setObjectName('widget')
        self.btn = QtWidgets.enterEvent(self, widget)
        self.btn.setGeometry(QtCore.QRect(0, 0, 120, 480))
        self.btn.text('')
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("sheesh.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.btn.setIcon(icon)
        self.btn.setGeometry(QtCore.QRect(0, 0, 20, 20))
        self.btn.setObjectName("btn")
        self.frame1 = QtWidgets.QFrame(self.widget)
        self.frame1.setGeometry(QtCore.QRect(850, 450, 850, 500))
        self.frame1.setStyleSheet("background:white;")
        self.frame1.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame1.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame1.setObjectName("frame1")
        self.frame2 = QtWidgets.QFrame(self.widget)
        self.frame2.setGeometry(QtCore.QRect(0, 0, 50, 500))
        self.frame2.setStyleSheet("background:white;")
        self.frame2.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame2.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame2.setObjectName("frame2")
        self.btn.raise_()
        MainWindow.setwidget(self.widget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)


class MainWindow(QtWidgets.QMainWindow, gg):
    def __init__(MainWindow, self):
        super(self, MainWindow).__init__(self)
        self.setupUi(self)
        self.btn.setCheckable(True)
        self.btn.enterEvent()
        self.btn.installEventFilter(self)

        self._animation = QtCore.QPropertyAnimation(self.frame2, b'size', self)
        self._animation.setStartValue(QtCore.QSize(50, self.height()))
        self._animation.setEndValue(QtCore.QSize(200, self.height()))
        self._animation.setDuration(100)

    def eventFilter(self, checked, event):
        if self.btn is checked:
            if event.type() == 2 and self.btn.isChecked():
                self._animation.setDirection(QtCore.QAbstractAnimation.Forward)
                self._animation.start()
            if event.type() == 2 and (not self.btn.isChecked()):
                self._animation.setDirection(QtCore.QAbstractAnimation.Backward)
                self._animation.start()
        return super(self, MainWindow).eventFilter(checked, event)


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    
    app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
    p = MainWindow()
    p.show()
    sys.exit(app.exec_())

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

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

Не изменяйте код, сгенерированный Qt Designer.

В основном я исправил ошибки, которые вы внесли когда вносили изменения в другой код.

from PyQt5 import QtCore, QtWidgets, QtGui  

class gg(object):
#    def setup(self, MainWindow):
    def setupUi(self, MainWindow):                                           # +++
    
#        MainWindow.objectName('ОКОШЕЧКО')
        MainWindow.setObjectName('ОКОШЕЧКО')                                 # +++
        
        MainWindow.resize(850, 500)
#        self.widget = QtWidgets.QtWidgets(MainWindow)
        self.widget = QtWidgets.QWidget(MainWindow)                          # +++
        
#        self.widget.setStileSheet('')
        self.widget.setStyleSheet('')                                        # +++
        
        self.widget.setObjectName('widget')
        
#        self.btn = QtWidgets.enterEvent(self, widget)
        self.btn = QtWidgets.QPushButton(self.widget)                        # +++
        
        self.btn.setGeometry(QtCore.QRect(0, 0, 120, 480))
#        self.btn.text('')
        self.btn.setText('')                                                 # +++
        
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("Ok.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) # "sheesh.png"
        self.btn.setIcon(icon)
        self.btn.setGeometry(QtCore.QRect(0, 0, 20, 20))
        self.btn.setObjectName("btn")
        self.frame1 = QtWidgets.QFrame(self.widget)
        self.frame1.setGeometry(QtCore.QRect(850, 450, 850, 500))
        self.frame1.setStyleSheet("background:white;")
        self.frame1.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame1.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame1.setObjectName("frame1")
        self.frame2 = QtWidgets.QFrame(self.widget)
        self.frame2.setGeometry(QtCore.QRect(0, 0, 50, 500))
        self.frame2.setStyleSheet("background:white;")
        self.frame2.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame2.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame2.setObjectName("frame2")
        self.btn.raise_()
        
#        MainWindow.setwidget(self.widget)
        MainWindow.setCentralWidget(self.widget)                             # +++

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):                                     # +++
        pass



class MainWindow(QtWidgets.QMainWindow, gg):
#    def __init__(MainWindow, self):    
#        super(self, MainWindow).__init__(self)
    def __init__(self):                                                      # +++
        super().__init__()                                                   # +++
        
        self.setupUi(self)
        
        self.btn.setCheckable(True)
# ?        self.btn.enterEvent()                                              # ???
        self.btn.installEventFilter(self)

        self._animation = QtCore.QPropertyAnimation(self.frame2, b'size', self)
        self._animation.setStartValue(QtCore.QSize(50, self.height()))
        self._animation.setEndValue(QtCore.QSize(200, self.height()))
        self._animation.setDuration(100)

    def eventFilter(self, checked, event):
        if self.btn is checked:
            if event.type() == 2 and self.btn.isChecked():
                self._animation.setDirection(QtCore.QAbstractAnimation.Forward)
                self._animation.start()
            if event.type() == 2 and (not self.btn.isChecked()):
                self._animation.setDirection(QtCore.QAbstractAnimation.Backward)
                self._animation.start()
#        return super(self, MainWindow).eventFilter(checked, event)               
        return super().eventFilter(checked, event)                                  # +++


if __name__ == '__main__':
    import sys
    
    app = QtWidgets.QApplication(sys.argv)
    app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
    p = MainWindow()
    p.show()
    sys.exit(app.exec_())

Update

Я могу сделать так, чтобы виджет открывался путем наведения на него курсором? И если могу, то как?

Да, можете:

QEvent::Leave - Мышь покидает границы виджета.

QEvent::Enter - Мышь входит в границы виджета (QEnterEvent).

from PyQt5 import QtCore, QtWidgets, QtGui  

class gg(object):
    def setupUi(self, MainWindow):                    # +++
        MainWindow.setObjectName('ОКОШЕЧКО')          # +++
        MainWindow.resize(850, 500)
        self.widget = QtWidgets.QWidget(MainWindow)   # +++
        self.widget.setStyleSheet('')                 # +++
        self.widget.setObjectName('widget')
        self.btn = QtWidgets.QPushButton(self.widget) # +++
        self.btn.setGeometry(QtCore.QRect(0, 0, 120, 480))
        self.btn.setText('')                          # +++
        
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("Ok.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) # "sheesh.png"
        self.btn.setIcon(icon)
        self.btn.setGeometry(QtCore.QRect(0, 0, 20, 20))
        self.btn.setObjectName("btn")
        self.frame1 = QtWidgets.QFrame(self.widget)
        self.frame1.setGeometry(QtCore.QRect(850, 450, 850, 500))
        self.frame1.setStyleSheet("background:white;")
        self.frame1.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame1.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame1.setObjectName("frame1")
        self.frame2 = QtWidgets.QFrame(self.widget)
        self.frame2.setGeometry(QtCore.QRect(0, 0, 50, 500))
        self.frame2.setStyleSheet("background:white;")
        self.frame2.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame2.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame2.setObjectName("frame2")
        self.btn.raise_()

        MainWindow.setCentralWidget(self.widget)           # +++

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):                   # +++
        pass


class MainWindow(QtWidgets.QMainWindow, gg):
    def __init__(self):                                    # +++
        super().__init__()                                 # +++
        
        self.setupUi(self)
        
        self.btn.setCheckable(True)
        self.btn.installEventFilter(self)

        self._animation = QtCore.QPropertyAnimation(self.frame2, b'size', self)
        self._animation.setStartValue(QtCore.QSize(50, self.height()))
        self._animation.setEndValue(QtCore.QSize(200, self.height()))
        self._animation.setDuration(100)

    def eventFilter(self, checked, event):
        
        if self.btn is checked:                                
#            if event.type() == 2 and self.btn.isChecked():
            if event.type() == event.Enter:                                         # <----<
                self._animation.setDirection(QtCore.QAbstractAnimation.Forward)
                self._animation.start()
#            if event.type() == 2 and (not self.btn.isChecked()):
            elif event.type() == event.Leave:                                       # <----<
                self._animation.setDirection(QtCore.QAbstractAnimation.Backward)
                self._animation.start()
             
        return super().eventFilter(checked, event)         # +++


if __name__ == '__main__':
    import sys
    
    app = QtWidgets.QApplication(sys.argv)
    app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
    p = MainWindow()
    p.show()
    sys.exit(app.exec_())

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

→ Ссылка