2017-04-20 9 views
0

J'ai un problème en essayant de développer une interface graphique avec PyQt5 et QT designer.Comment créer une fenêtre qui ouvre une autre fenêtre avec le module uic ?? Qt-Designer et Python

Je veux utiliser le module uic, j'ai un fichier .ui appelé , et un autre login.ui, comme je peux appeler de login.ui au registry.ui, en cliquant sur buttom registro

J'ai aussi le Login.py, Registro.py fichiers respectivement

Mon intention est de cliquer sur le bouton d'enregistrement, et ouvrez la fenêtre d'enregistrement

en utilisant seulement la uic.loadUI() méthode?

Ici, je montre mon code

Classe Connexion login.py

import sys 
import time 
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget 
from PyQt5 import uic 
import Con_pos 
from Registro import Registro 
class Login(QWidget): 

    def __init__(self): 
     QWidget.__init__(self) 
     uic.loadUi("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() 
     print(password) 
     fecha = time.strftime("%X") + " " + time.strftime("%x") 
     if user != "" and password != "": 
      consulta = ''' SELECT "id_user" FROM "User" WHERE "id_user" = '%s' ; ''' %(user) 
      c_user = con.consulta(consulta) 
      print(c_user) 
      consulta = ''' SELECT "pass" FROM "User" WHERE "id_user" = '%s' ;''' %(user) 
      c_pass = con.consulta(consulta) 
      if c_user != None: 
       c_pass = c_pass[0] 
       print("test") 
       print(c_pass) 
       if c_pass == password: 
        consulta = ''' INSERT INTO "sesion" VALUES ('%s', '%s', '%s'); '''%(fecha ,pid, user) 
        con.insertar(consulta) 
    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): 
     reg = Registro.Registro() 
     reg.show() 

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

classe Registro: Registro.py

import sys 
import time 
from PyQt5.QtWidgets import QApplication, QMainWindow 
from PyQt5 import uic 
import Con_pos 
import error_log as error 

class Registro(QMainWindow): 
    con = Con_pos.con_pos() 
    def __init__(self): 
     QMainWindow.__init__(self) 
     uic.loadUi("Registro.ui", self) 
     self.btn_reg.clicked.connect(self.validar_nombre) 

    def validar_nombre(self): 
     fecha = time.strftime("%X") + " " + time.strftime("%x") 
     usuario = self.user_tx_input.text() 
     password = self.pass_tx_input.text() 
     if usuario != "": 
      pid = self.getPID() 
      consul = '''SELECT "id_user" FROM "User" WHERE "id_user" = '%s'; ''' % (usuario) 
      res_con = Registro.con.consulta(consul) 

      if not res_con: 
       ins_user = '''INSERT INTO "User" VALUES ('%s', '%s') ''' % (usuario, password) 
       ins_sesion = ''' INSERT INTO "sesion" VALUES ('%s', %s,'%s') ''' % (fecha, pid, usuario) 
       Registro.con.insertar(ins_user) 
       Registro.con.insertar(ins_sesion) 
      else: 
       err = error.error_dia() 
       err.etiqueta.setText("El usuario %s ya esta en uso" % (usuario)) 
       err.exec() 

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

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    ventana = Registro() 
    ventana.show() 
    sys.exit(app.exec()) 
+0

Lorsque vous appelez la fenêtre d'enregistrement, ce qui arrive à la fenêtre de connexion est maintenue ouverte ou fermée? – eyllanesc

+0

Le problème est que je ne peux pas appeler la fenêtre "Registro", j'obtiens une erreur, et tout ferme, mais mon but est d'ouvrir la fenêtre "Registro" par le login – Andres

+0

J'ai proposé une solution, essayez – eyllanesc

Répondre

0

Vous devez passer en tant que parent d'un par AMETER à la nouvelle fenêtre, vous pouvez le faire de deux façons:

  1. première solution: Faire la variable reg un attribut de la classe:

def view_Registro(self): 
    self.reg = Registro() 
    self.reg.show() 
  1. Deuxième solution: Passer en paramètre à la même instance:

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

Pour cette solution, vous devez changer:

class Registro(QMainWindow): 
    con = Con_pos.con_pos() 
    def __init__(self): 
     QMainWindow.__init__(self) 

à

class Registro(QMainWindow): 
    con = Con_pos.con_pos() 
    def __init__(self, parent=None): 
     QMainWindow.__init__(self, parent=parent) 
+0

Bonjour essayez déjà, les 2 étapes m'a donné, mais je laisse encore erreur l'erreur que je reçois est la suivante: retraçage (le plus récent appel dernier): fichier « Login.py », ligne 43, dans view_Registro Reg = Record.Registration (auto) AttributeError: l'objet type 'Record' n'a pas d'attribut 'Record' [1] 434 abort (core dumped) python Login.py – Andres

+0

Utiliser la première solution – eyllanesc

+0

2 solutions, pas 2 étapes. – eyllanesc