Ошибка «Объект не имеет атрибута» применительно к строке состояния не показывает статус - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь загрузить и удалить изображения при загрузке изображения. Я создаю строку состояния, чтобы сообщить мне имя файла, и если я ее удаляю, панель очищается, я получаю эту ошибку и не знаю, что это может быть, к счастью, они загружают мне изображения, но в консоль выдает эту ошибку и не показывает строку состояния (я оставляю часть кода), спасибо ...

Ошибка

Traceback (последний вызов был последним): файл "lol.py", строка 220, в self.animacionMostar.finished.connect (lambda: (self.statusBar.showMessage (nombre))) AttributeError: ' Объект VentanaVISUALIZAR не имеет атрибута 'statusBar'

Код:

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)
        
                 

1 Ответ

0 голосов
/ 11 апреля 2020

VentanaVISUALIZAR - это подкласс QDialog, который по умолчанию не имеет строки состояния. Вы можете добавить один, добавив что-то вроде этого в VentanaVISUALIZAR.__init__:

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