python-3.xqtpyqt5qstatusbar

Error "Object has no attribute" applied to status Bar does not show status


I am trying to load and delete images when loading an image I create a status bar to tell me the name of the file and if I delete it, the bar is cleaned, I get this error and I do not know what it may be, luckily they load me the images but in the console, it throws me that error and it does not show me the status bar (I leave part of the code), thanks...

Error

Traceback (most recent call last): File "lol.py", line 220, in self.animacionMostar.finished.connect(lambda: (self.statusBar.showMessage(nombre))) AttributeError: 'VentanaVISUALIZAR' object has no attribute 'statusBar'

Code:

class VentanaVISUALIZAR(QDialog):
    def __init__(self, parent=None):
        super(VentanaVISUALIZAR, self).__init__()

        self.setWindowIcon(QIcon("icono.png"))
        self.setWindowTitle("Visualizador ")
        self.setWindowFlags(Qt.MSWindowsFixedSizeDialogHint)
        self.setFixedSize(1020, 680)
        
        
        self.widget() 
    def widget(self):

# ===================== LLAMAR WIDGETS =======================

        framePrincipal = QFrame(self)
        framePrincipal.setFrameShape(QFrame.Box)
        framePrincipal.setFrameShadow(QFrame.Sunken)
        framePrincipal.setAutoFillBackground(True)
        framePrincipal.setBackgroundRole(QPalette.Light)
        framePrincipal.setFixedSize(1000, 560)
        framePrincipal.move(10, 10)

        frame = QFrame(framePrincipal)
        frame.setFixedSize(980, 540)
        frame.move(10, 10)

        self.labelImagen = QLabel(frame)
        self.labelImagen.setAlignment(Qt.AlignCenter)
        self.labelImagen.setGeometry(0, 0, 980, 540)

        self.labelImagenUno = QLabel(frame)
        self.labelImagenUno.setAlignment(Qt.AlignCenter)
        self.labelImagenUno.setGeometry(-970, 0, 980, 540)
        
                   
        
# =================== BOTONES VISUALIZADOR ==================
        botonVCargar = QPushButton("Cargar Imagen", self)
        botonVCargar.setGeometry(QRect(10,590,325,30))
        botonVCargar.setIcon(QtGui.QIcon("cargar.png"))
        botonVCargar.setIconSize(QtCore.QSize(20,20))
        
        botonVEliminar = QPushButton("Eliminar Imagen", self)
        botonVEliminar.setGeometry(QRect(350,590,325,30))
        botonVEliminar.setIcon(QtGui.QIcon("borrar.png"))
        botonVEliminar.setIconSize(QtCore.QSize(20,20))
        
#================== ACCIONES BOTONES VISUALIZADOR ===================

        
        botonVCargar.clicked.connect(self.Cargar)
        botonVEliminar.clicked.connect(self.Eliminar)
            
        posicion = int
        carpetaActual = QDir()
        imagenesCarpeta = []
    def bloquearBotones(self, bool):
        self.botonVCargar.setEnabled(bool)
        self.botonVEliminar.setEnabled(bool)
        
        
        
    def Mostrar (self, label, imagen, nombre, posicionX=970):
        imagen = QPixmap.fromImage(imagen)

    # Escalar imagen a 640x480 si el ancho es mayor a 640 o el alto mayor a 480
        if imagen.width() > 980 or imagen.height() > 540:
            imagen = imagen.scaled(980, 540, Qt.KeepAspectRatio, Qt.SmoothTransformation)

        # Mostrar imagen
        label.setPixmap(imagen)

        # Animación (al finalizar la animación se muestra en la barra de estado el nombre y la extensión de la imagen
        # y se desbloquean los botones).       
        self.animacionMostar = QPropertyAnimation(label, b"geometry")
        self.animacionMostar.finished.connect(lambda: (self.statusBar.showMessage(nombre)))
        self.animacionMostar.setDuration(200)
        self.animacionMostar.setStartValue(QRect(posicionX, 0, 960, 540))
        self.animacionMostar.setEndValue(QRect(0, 0, 960, 540))
        self.animacionMostar.start(QAbstractAnimation.DeleteWhenStopped)
        
        
    def Limpiar(self, labelConImagen, labelMostrarImagen, imagen, nombre,
            posicionInternaX, posicionX=None):

        def Continuar(estado):
            if estado:
                if posicionX:
                    self.Mostrar(labelMostrarImagen, imagen, nombre, posicionX)
                else:
                    self.Mostrar(labelMostrarImagen, imagen, nombre)
                
        self.animacionLimpiar = QPropertyAnimation(labelConImagen, b"geometry")
        self.animacionLimpiar.finished.connect(lambda: labelConImagen.clear())
        self.animacionLimpiar.setDuration(200)
        # self.animacionLimpiar.valueChanged.connect(lambda x: print(x))
        self.animacionLimpiar.stateChanged.connect(Continuar)
        self.animacionLimpiar.setStartValue(QRect(0, 0, 980, 540))
        self.animacionLimpiar.setEndValue(QRect(posicionInternaX, 0, 980, 540))
        self.animacionLimpiar.start(QAbstractAnimation.DeleteWhenStopped)

    def Cargar(self):
        
        nombreImagen, _ = QFileDialog.getOpenFileName(self, "Seleccionar imagen",
                                                      QDir.currentPath(),
                                                      "Archivos de imagen (*.jpg *.png *.ico *.bmp)")

        if nombreImagen:
            # Verificar que QLabel tiene imagen
            labelConImagen = ""
            if self.labelImagen.pixmap():
                labelConImagen = self.labelImagen
            elif self.labelImagenUno.pixmap():
                labelConImagen = self.labelImagenUno
                    
            imagen = QImage(nombreImagen)
            if imagen.isNull():
                if labelConImagen:
                    self.Eliminar()
                        
                QMessageBox.information(self, "Visor de imágenes",
                                        "No se puede cargar %s." % nombreImagen)
                return
                
            # Obtener ruta de la carpeta que contiene la imagen seleccionada
            self.carpetaActual = QDir(QFileInfo(nombreImagen).absoluteDir().path())

            # Obtener la ruta y el nombre de las imagenes que se encuentren en la carpeta de
            # la imagen seleccionada
            imagenes = self.carpetaActual.entryInfoList(["*.jpg", "*.png", "*.ico", "*.bmp"],
                                                        QDir.Files, QDir.Name)
            self.imagenesCarpeta = [imagen.absoluteFilePath() for imagen in imagenes]

            self.posicion = self.imagenesCarpeta.index(nombreImagen)

            # Función encargada de bloquear o desbloquear los botones
            #self.bloquearBotones(False)

            # Nombre y extensión de la imagen
            nombre = QFileInfo(nombreImagen).fileName()
                
            if labelConImagen:
                posicionInternaX = -970
                labelMostrarImagen = self.labelImagen if self.labelImagenUno.pixmap() else self.labelImagenUno
                self.Limpiar(labelConImagen, labelMostrarImagen, imagen, nombre, posicionInternaX)
            else:
                self.Mostrar(self.labelImagen, imagen, nombre)
        


    def Eliminar(self):
        def establecerValores():
            labelConImagen.clear()
            labelConImagen.move(0, 0)

            # Limpiar la barra de estado
            self.statusBar.clearMessage()

            # Establecer los valores predeterminados
            self.posicion = int
            self.estadoAnterior, self.estadoSiguiente = False, False
            self.carpetaActual = QDir()
            self.imagenesCarpeta.clear()

            #self.bloquearBotones(True)
                
        # Verificar que QLabel tiene imagen
        labelConImagen = ""
        if self.labelImagen.pixmap():
            labelConImagen = self.labelImagen
        elif self.labelImagenUno.pixmap():
            labelConImagen = self.labelImagenUno
                    
        if labelConImagen:
            #self.bloquearBotones(False)
                
            self.animacionEliminar = QPropertyAnimation(labelConImagen, b"geometry")
            self.animacionEliminar.finished.connect(establecerValores)
            self.animacionEliminar.setDuration(200)
            self.animacionEliminar.setStartValue(QRect(0, 0, 640, 480))
            self.animacionEliminar.setEndValue(QRect(-650, 0, 640, 480))
            self.animacionEliminar.start(QAbstractAnimation.DeleteWhenStopped)
        
                 


Solution

  • VentanaVISUALIZAR is a subclass of QDialog which does not have a status bar by default. You can add one by adding something like this to VentanaVISUALIZAR.__init__:

    self.statusBar = QStatusBar(self)
    self.statusBar.setSizeGripEnabled(False)
    self.statusBar.move(0,650)
    self.statusBar.setFixedSize(1020,30)