0

我在加载图像时尝试加载和删除图像我创建一个状态栏来告诉我文件的名称,如果我删除它,该栏被清理,我收到此错误,我不知道它可能是什么,幸运的是,他们加载了我的图像,但在控制台中,它向我抛出了那个错误并且它没有显示状态栏(我留下了部分代码),谢谢......

错误

回溯(最后一次调用):文件“lol.py”,第 220 行,在 self.animacionMostar.finished.connect(lambda: (self.statusBar.showMessage(nombre))) AttributeError: 'VentanaVISUALIZAR' 对象没有属性'状态栏'

代码:

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)
        
                 

4

1 回答 1

0

VentanaVISUALIZARQDialog默认情况下没有状态栏的子类。您可以通过添加以下内容来添加一个VentanaVISUALIZAR.__init__

self.statusBar = QStatusBar(self)
self.statusBar.setSizeGripEnabled(False)
self.statusBar.move(0,650)
self.statusBar.setFixedSize(1020,30)
于 2020-04-11T07:07:34.527 回答