1

Problems with Qt How to open 2 windows that are called between them

Hi all, I'm new with Qt, the problem I have is the following:

I have a Login.py window when I call with a button open a new Panel_administrator.py window and this window has a button that can call Login.py

in a nutshell:

Login.py---->calls -----> Panel_Administrador.py and

Panel_Administrador.py ----> calls ----> Login.py

Gives me the following error:

Traceback (most recent call last): ................. ImportError: cannot import name 'panel_administrador'

my code:

import sys
import time

from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QWidget

import Con_pos
from Registro import Registro
from Panel_Administrador import panel_administrador


class Login(QWidget):

    def __init__(self, parent=None):
        QWidget.__init__(self, parent= parent)
        uic.loadUi("UI/Login.ui", self)
        self.registro.clicked.connect(self.view_Registro)
        self.ingresar.clicked.connect(self.autenticar)

    def autenticar(self):
        pid = self.getPID()
        con = Con_pos.con_pos()
        user = self.in_login.text()
        password = self.in_pass.text()
        fecha = time.strftime("%X") + " " + time.strftime("%x")
        if user != "" and password != "":
            consulta = ''' SELECT "id_usuario" FROM "usuarios"."Usuario" WHERE "id_usuario" = '%s' ; ''' %(user)
            c_user = con.consulta(consulta)
            consulta = ''' SELECT "pass" FROM "usuarios"."Usuario" WHERE "id_usuario" = '%s' ;''' %(user)
            c_pass = con.consulta(consulta)
            if c_user != None or not c_pass:
                c_pass = c_pass[0][0]
                if c_pass == password:
                    consulta = ''' INSERT INTO "usuarios"."sesion" VALUES ('%s', '%s', %s); '''%(user ,fecha, pid)
                    con.insertar(consulta)
                    print("Ingresando al sistema...")
                    if self.administrador(user):
                        self.admi = panel_administrador()
                        self.admi.show()
                else:
                    print("Usuario o password incorrecto")

    def administrador(self, user):
        ad = ''' SELECT "id_rol" FROM "usuarios"."Rol" WHERE "rol" = 'administrador'; '''
        consulta = ''' SELECT "id_usuario_Usuario" FROM "usuarios"."Usuario_Rol" WHERE "id_rol_Rol" = %s and "id_usuario_Usuario" = '%s' ''' %(ad, user)
        con_res = Con_pos.con_pos().consulta(consulta)
        print(con_res)
        if con_res or con_res != None:
            return True
        else:
            return False;

    def getPID(self):
        con = Con_pos.con_pos()
        func = "pg_backend_pid"
        pid = con.call_proc(func)
        pid = pid[0][0]
        return pid

    def view_Registro(self):
        self.reg = Registro()
        self.reg.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    login = Login()
    login.show()
    sys.exit(app.exec())

Panel_Administrador.py

import sys

from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QWidget

from Designar import designar
from Funciones import funciones
from Login import Login
from Admi_Users import admin_user
from Rol import rol


class panel_administrador(QWidget):

    def __init__(self):
        QWidget.__init__(self)
        uic.loadUi("UI/Panel_Administrador.ui", self)
        self.btn_funciones.clicked.connect(self.view_funciones)
        self.btn_roles.clicked.connect(self.view_roles)
        self.btn_usuarios.clicked.connect(self.view_usuario)
        self.btn_designar.clicked.connect(self.view_designar)
        self.btn_login.clicked.connect(self.view_login)

    def view_funciones(self):
        self.f = funciones()
        self.f.show()

    def view_roles(self):
        self.r = rol()
        self.r.show()

    def view_usuario(self):
        self.u = admin_user()
        self.u.show()

    def view_designar(self):
        self.d = designar()
        self.d.show()

    def view_login(self):
        self.l = Login()
        self.l.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    pa = panel_administrador()
    pa.show()
    sys.exit(app.exec())
eyllanesc
  • 235,170
  • 19
  • 170
  • 241
Andres
  • 17
  • 5

1 Answers1

0

The problem that occurs is called circular import, where it generates a recursive cycle. The solution is to structure the code better. In this case I will show an example of how to do it, I will create 2 classes called admin panel and Login that contains a button each, the object is to call the other window and vice versa. Create another file that I will call main.py where I will make the connections between the buttons.

The files have the following structure:

├── Login.py
├── main.py
└── Panel_Administrador.py

Login.py

from PyQt5.QtWidgets import QWidget, QPushButton, QVBoxLayout

class Login(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent= parent)
        self.setWindowTitle("Login")
        lay = QVBoxLayout(self)
        self.btn = QPushButton("LLamar a Panel Administrador")
        lay.addWidget(self.btn)
        self.btn.clicked.connect(self.hide)

Panel_Administrador.py

from PyQt5.QtWidgets import QWidget, QPushButton, QVBoxLayout

class panel_administrador(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent=parent)
        self.setWindowTitle("Panel de Administración")
        lay = QVBoxLayout(self)
        self.btn = QPushButton("Llamar a Login")
        lay.addWidget(self.btn)
        self.btn.clicked.connect(self.hide)

main.py

from PyQt5.QtWidgets import QApplication
import sys

from Panel_Administrador import panel_administrador
from Login import Login

if __name__ == "__main__":
    app = QApplication(sys.argv)
    p = panel_administrador()
    l = Login()
    l.btn.clicked.connect(p.show)
    p.btn.clicked.connect(l.show)
    p.show()

    sys.exit(app.exec())
eyllanesc
  • 235,170
  • 19
  • 170
  • 241