Foros Python
.ui a .py, cómo debo importarlos? - Versión para impresión

+- Foros Python (https://foro.recursospython.com)
+-- Foro: Desarrollo (https://foro.recursospython.com/forumdisplay.php?fid=1)
+--- Foro: Aplicaciones de escritorio (https://foro.recursospython.com/forumdisplay.php?fid=4)
+--- Tema: .ui a .py, cómo debo importarlos? (/showthread.php?tid=545)



.ui a .py, cómo debo importarlos? - rakamapi - 28-01-2020

Hola, quisiera saber la sintaxis correcta para importar archivos archivos .py previamente convertidos desde .ui

En mi aplicación tengo 5 clases y cada una de ellas debería importar un archivo convertido distinto.

Si trabajo directamente con los archivos .ui no tengo inconvenientes. Ahora al intentar utilizar los archivos convertidos me salen errores de éste tipo:

self.btn_limpiar.clicked.connect(lambda: sigeco_funciones.limpio_campos(\

AttributeError: 'VentanaAcceso' object has no attribute 'btn_limpiar'


Gracias !!

NOTA: he intentado implementar lo mencionado en la guía https://recursospython.com/guias-y-manuales/convertir-qtdesigner-a-codigo-python/ pero no logro aplicarlo a varias clases desde mi aplicación principal.


RE: .ui a .py, cómo debo importarlos? - Francisco - 30-01-2020

Hola, ¿cómo estás?

Es difícil sin ver al menos parte del código. No obstante, si recibís un AttributeError al acceder a self.btn_limpiar es porque ese botón no está definido en la clase desde la cual lo estás llamado (¿tal vez en alguna de las otras cuatro?).

Saludos!


RE: .ui a .py, cómo debo importarlos? - rakamapi - 10-02-2020

Hola Francisco, gracias y perdón por la demora en responder.

Repasando, el error que tira es el siguiente:

self.btn_limpiar.clicked.connect(lambda: sigeco_funciones.limpio_campos(self, self.var_pwd))

AttributeError: 'VentanaAcceso' object has no attribute 'btn_limpiar'



Te paso lo que sería (resumido) cómo estoy intentando hacer referencia desde mi aplicación principal al botón del archivo .py resultante de la conversión desde su original .ui (en color rojo la linea que tira el error):

import gui_acceso_ensayo
from gui_acceso_ensayo import Ui_AccesoWindow


from subprocess import Popen
from collections import Counter
from PyQt5 import uic, QtGui, QtWidgets, QtCore


class VentanaAcceso(QtWidgets.QDialog):
    """ Acceso al Sistema """

    def __init__(self):
        QtWidgets.QDialog.__init__(self)
        # --------- Del modo siguiente, con el archivo ui directamente, funciona OK. ---------
        # uic.loadUi(os.path.join(gbl_ruta,"gui_acceso.ui"), self) 
        # ---------------------------------------------------------------------------------

        self.btn_limpiar.clicked.connect(lambda: sigeco_funciones.limpio_campos(self, self.var_pwd))       

        self.var_pwd.setFocus()

***************************************************************************
A continuación el código del archivo gui_acceso_ensayo.py generado desde el gui_acceso_ensayo.ui:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'gui_acceso_ensayo.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_AccesoWindow(object):
    def setupUi(self, AccesoWindow):
        AccesoWindow.setObjectName("AccesoWindow")
        AccesoWindow.resize(268, 360)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Ignored)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(AccesoWindow.sizePolicy().hasHeightForWidth())
        AccesoWindow.setSizePolicy(sizePolicy)
        AccesoWindow.setMaximumSize(QtCore.QSize(268, 360))
        AccesoWindow.setContextMenuPolicy(QtCore.Qt.NoContextMenu)
        AccesoWindow.setWindowTitle("SiGeCo")
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("imagenes/logo_peq.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        AccesoWindow.setWindowIcon(icon)
        AccesoWindow.setToolTip("")
        AccesoWindow.setWhatsThis("")
        AccesoWindow.setAutoFillBackground(True)
        self.label_fdo = QtWidgets.QLabel(AccesoWindow)
        self.label_fdo.setEnabled(True)
        self.label_fdo.setGeometry(QtCore.QRect(0, 0, 268, 360))
        self.label_fdo.setMinimumSize(QtCore.QSize(268, 360))
        self.label_fdo.setMaximumSize(QtCore.QSize(268, 360))
        self.label_fdo.setBaseSize(QtCore.QSize(268, 360))
        self.label_fdo.setText("")
        self.label_fdo.setPixmap(QtGui.QPixmap("imagenes/fdo_acceso.jpg"))
        self.label_fdo.setObjectName("label_fdo")
        self.var_pwd = QtWidgets.QLineEdit(AccesoWindow)
        self.var_pwd.setGeometry(QtCore.QRect(40, 293, 131, 21))
        font = QtGui.QFont()
        font.setPointSize(10)
        self.var_pwd.setFont(font)
        self.var_pwd.setStyleSheet("background-color: rgb(255, 254, 230);")
        self.var_pwd.setMaxLength(10)
        self.var_pwd.setEchoMode(QtWidgets.QLineEdit.Password)
        self.var_pwd.setPlaceholderText("")
        self.var_pwd.setObjectName("var_pwd")
        self.btn_limpiar = QtWidgets.QPushButton(AccesoWindow)
        self.btn_limpiar.setGeometry(QtCore.QRect(140, 320, 24, 24))
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHorizontalStretch(24)
        sizePolicy.setVerticalStretch(24)
        sizePolicy.setHeightForWidth(self.btn_limpiar.sizePolicy().hasHeightForWidth())
        self.btn_limpiar.setSizePolicy(sizePolicy)
        self.btn_limpiar.setMinimumSize(QtCore.QSize(24, 24))
        self.btn_limpiar.setMaximumSize(QtCore.QSize(24, 24))
        self.btn_limpiar.setBaseSize(QtCore.QSize(24, 24))
        self.btn_limpiar.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.btn_limpiar.setStyleSheet("background-color: \"transparent\";")
        self.btn_limpiar.setText("")
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap("imagenes/set4_limpiar.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.btn_limpiar.setIcon(icon1)
        self.btn_limpiar.setIconSize(QtCore.QSize(24, 24))
        self.btn_limpiar.setObjectName("btn_limpiar")

        self.retranslateUi(AccesoWindow)
        QtCore.QMetaObject.connectSlotsByName(AccesoWindow)


Bueno, espero que alcance como para aclarar el tema.

Gracias !!!


RE: .ui a .py, cómo debo importarlos? - Francisco - 10-02-2020

Bien, entonces tenés que hacer que tu VentanaAcceso herede de Ui_AccesoWindow:

  1. class VentanaAcceso(Ui_AccesoWindow):
  2. """ Acceso al Sistema """
  3.  
  4. def __init__(self):
  5. super().__init__(self)
  6. self.btn_limpiar.clicked.connect(lambda: sigeco_funciones.limpio_campos(self, self.var_pwd))
  7. self.var_pwd.setFocus()


No lo probé, pero calculo que eso es suficiente. Ahora no recuerdo si super() se lleva bien con Qt; si tenés problemas en esa línea, la podés reemplazar por:

  1. Ui_AccesoWindow.__init__(self, self)


Saludos


RE: .ui a .py, cómo debo importarlos? - rakamapi - 10-02-2020

Gracias Francisco, continúa el inconveniente:Si utilizo super().__init__(self), el error es: TypeError: object.__init__() takes exactly one argument (the instance to initialize) Si cambio la línea por Ui_AccesoWindow.__init__(self, self), el error es:TypeError: object.__init__() takes exactly one argument (the instance to initialize)Finalmente probé quitarle un self: Ui_AccesoWindow.__init__(self), y vuelve el error original:AttributeError: \'VentanaAcceso' object has no attribute 'btn_limpiar' ¿Alguna otra alternativa?Saludos


RE: .ui a .py, cómo debo importarlos? - Francisco - 11-02-2020

Ahora que lo pude probar con un código similar, debería ser así:

  1. class VentanaAcceso(QtWidgets.QDialog):
  2. def __init__(self, *args, **kwargs):
  3. super().__init__(self, *args, **kwargs)
  4. dialog = Ui_AccesoWindow()
  5. dialog.setupUi(self)
  6. self.btn_limpiar.clicked.connect(lambda: sigeco_funciones.limpio_campos(self, self.var_pwd))
  7. self.var_pwd.setFocus()


Saludos


RE: SOLUCIONADO --> .ui a .py, cómo debo importarlos? - rakamapi - 11-02-2020

Perfecto Francisco, funciona !!!. Sólo tuve que introducir un pequeño agregado. Finalmente quedó así:

class VentanaAcceso(QtWidgets.QDialog):
    """ Acceso al Sistema """

    def __init__(self, *args, **kwargs):
        QtWidgets.QDialog.__init__(self, *args, **kwargs)
        self.dialog = Ui_AccesoWindow()
        self.dialog.setupUi(self)
        self.dialog.btn_limpiar.clicked.connect(lambda: sigeco_funciones.limpio_campos(self, self.dialog.var_pwd))

        self.dialog.var_pwd.setFocus()

Muchas gracias !!!

Saludos.