TransWikia.com

Llamar una clase desde otra clase entre 2 archivos

Stack Overflow en español Asked on November 13, 2021

Tengo 2 archivos uno.py y dos.py la intencion es que pueda llamar al QMainWindow que esta en uno.py desde dos.py y llamar al QDialog que esta en dos.py desde uno.py

El problema es que al tratar de hacerlo me lanza un error, el error solo muestra que alguna de las 2 clases tiene un conflicto pero no muestra que.

Uno.py

from PyQt5.QtWidgets import QMainWindow,QApplication,QPushButton
from Dos import C_Dos #Esto genera el eror

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

        boton = QPushButton(self)
        boton.setText("Abrir")
        boton.clicked.connect(lambda:self.Abrir())

    def Abrir(self):
        print("ok")
        C_Dos().show()
        self.hide()

Dos.py

from PyQt5.QtWidgets import QDialog,QApplication,QPushButton
from Uno import Main  #Esto genera el error

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

        boton = QPushButton(self)
        boton.setText("Abrir")
        boton.clicked.connect(lambda:self.Abrir())

    def Abrir(self):
        print("ok")
        Main().show()
        self.close()


app = QApplication([])
c = C_Dos()
c.show()
c.resize(500,400)
app.exec_()

Traceback Uno.py

Traceback (most recent call last):
  File "C:UsersAngel-DellDesktopUno.py", line 2, in <module>
    from Dos import C_Dos #Esto genera el eror
  File "C:UsersAngel-DellDesktopDos.py", line 2, in <module>
    from Uno import Main  #Esto genera el error
  File "C:UsersAngel-DellDesktopUno.py", line 2, in <module>
    from Dos import C_Dos #Esto genera el eror
ImportError: cannot import name 'C_Dos'

Process returned 1 (0x1)        execution time : 0.091 s
Presione una tecla para continuar . . .

Traceback Dos.py

Traceback (most recent call last):
  File "C:UsersAngel-DellDesktopDos.py", line 2, in <module>
    from Uno import Main  #Esto genera el error
  File "C:UsersAngel-DellDesktopUno.py", line 2, in <module>
    from Dos import C_Dos #Esto genera el eror
  File "C:UsersAngel-DellDesktopDos.py", line 2, in <module>
    from Uno import Main  #Esto genera el error
ImportError: cannot import name 'Main'

Process returned 1 (0x1)        execution time : 0.089 s
Presione una tecla para continuar . . .

One Answer

Tienes un problema de importación cruzada o cíclica. Es como un pez que se muerde la cola. Te recomiendo que des un repaso a este post publicado en Pythond

Una solución puede ser añadir una tercera clase que haga referencia a los dos módulos que quieres importar evitando de esta manera la referencia entre ellos.

Tu código rehecho según esta posible solución puede ser el siguiente:

Uno.py

from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton

class Main(QMainWindow):
    def __init__(self,app):
        QMainWindow.__init__(self)

        boton = QPushButton(self)
        boton.setText("Abrir")
        boton.clicked.connect(app.abrirDialog)

Dos.py

from PyQt5.QtWidgets import QDialog,QPushButton

class C_Dos(QDialog):
    def __init__(self,app):
        QDialog.__init__(self)

        boton = QPushButton(self)
        boton.setText("Abrir")
        boton.clicked.connect(app.abrirMainWindow)

app.py

from PyQt5.QtWidgets import QApplication

#Ninguno de los dos modulos se conoce
from Uno import Main
from Dos import C_Dos

class App():
    def __init__(self):
        self.mainWindow = Main(self)
        self.mainWindow.setWindowTitle('Uno Main Window')
        self.dosDialog = C_Dos(self)
        self.dosDialog.setWindowTitle('Dos Dialog')
        self.mainWindow.show()
        self.mainWindow.resize(500,400)

    def abrirDialog(self):
        print("openning dialog")
        self.dosDialog.show()
        self.dosDialog.resize(500,400)
        print("closing main window")
        self.mainWindow.close()

    def abrirMainWindow(self):
        print("openning main window")
        self.mainWindow.show()
        print("closing dos dialog")
        self.dosDialog.close()

def main():
    qapp = QApplication([])
    app = App()
    qapp.exec_()


if __name__ == "__main__":
    main()

Answered by David on November 13, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP