0

Contexto:

Tengo dos archivos Uno.py y Dos.py entre los cuales trato de realizar una importación cíclica, en uno de ellos tengo una QMainWindow y en el otro un QDialog, al oprimir un botón la ventana actual debe cerrarse y abrir la ventana del otro archivo.

Problema:

El problema es que al presionar el botón no se cierra la ventana y sale el siguiente mensaje:

QCoreApplication::exec: The event loop is already running

Anexo un ejemplo:

introducir la descripción de la imagen aquí

La intención es que al presionar un botón se abra la otra ventana y se cierre la actual y viceversa

Uno.py

from PyQt5.QtWidgets import QMainWindow,QApplication,QPushButton

class Class_Uno(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.Boton = QPushButton(self)
        self.Boton.setText("Presioname")
        self.Boton.clicked.connect(self.Conexion)

    def Conexion(self):
        from Dos import Class_Dos
        self.dos = Class_Dos()
        self.dos.show()
        self.close()


app = QApplication([])
cu = Class_Uno()
cu.show()
app.exec_()

Dos.py

from PyQt5.QtWidgets import QDialog,QApplication,QPushButton

class Class_Dos(QDialog):
    def __init__(self):
        QDialog.__init__(self)

        self.BotonDos = QPushButton(self)
        self.BotonDos.setText("Presioname 2")
        self.BotonDos.clicked.connect(self.Conectar)
        self.resize(300,200)

    def Conectar(self):
        from Uno import Class_Uno
        self.uno = Class_Uno()
        self.uno.show()
        self.close()

1 Answers1

2

El problema no es la importación cíclica sino que cada vez que importas Uno estas ejecutando:

app = QApplication([])
cu = Class_Uno()
cu.show()
app.exec_()

Donde estas creando un nuevo QApplicatión, pero Qt lo prohibe. Asi que uno posible solución es usar if __name__ == '__main__': para que solo sea ejecutado una sola vez(para más información lee esta respuesta).

from PyQt5.QtWidgets import QMainWindow,QApplication,QPushButton

class Class_Uno(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.Boton = QPushButton(self)
        self.Boton.setText("Presioname")
        self.Boton.clicked.connect(self.Conexion)

    def Conexion(self):
        from Dos import Class_Dos
        self.dos = Class_Dos()
        self.dos.show()
        self.close()


if __name__ == '__main__':

    app = QApplication([])
    cu = Class_Uno()
    cu.show()
    app.exec_()