Mensajes: 19
Temas: 8
Registro en: Jul 2019
Reputación:
0
28-01-2020, 10:45 AM
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-manua...go-python/ pero no logro aplicarlo a varias clases desde mi aplicación principal.
Mensajes: 1.300
Temas: 3
Registro en: Feb 2016
Reputación:
71
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!
Mensajes: 19
Temas: 8
Registro en: Jul 2019
Reputación:
0
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 !!!
Mensajes: 1.300
Temas: 3
Registro en: Feb 2016
Reputación:
71
Bien, entonces tenés que hacer que tu VentanaAcceso herede de Ui_AccesoWindow:
Código: class VentanaAcceso(Ui_AccesoWindow):
""" Acceso al Sistema """
def __init__(self):
super().__init__(self)
self.btn_limpiar.clicked.connect(lambda: sigeco_funciones.limpio_campos(self, self.var_pwd))
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:
Código: Ui_AccesoWindow.__init__(self, self)
Saludos
Mensajes: 19
Temas: 8
Registro en: Jul 2019
Reputación:
0
10-02-2020, 07:12 PM
(Última modificación: 11-02-2020, 03:31 PM por Francisco.)
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
Mensajes: 1.300
Temas: 3
Registro en: Feb 2016
Reputación:
71
Ahora que lo pude probar con un código similar, debería ser así:
Código: class VentanaAcceso(QtWidgets.QDialog):
def __init__(self, *args, **kwargs):
super().__init__(self, *args, **kwargs)
dialog = Ui_AccesoWindow()
dialog.setupUi(self)
self.btn_limpiar.clicked.connect(lambda: sigeco_funciones.limpio_campos(self, self.var_pwd))
self.var_pwd.setFocus()
Saludos
Mensajes: 19
Temas: 8
Registro en: Jul 2019
Reputación:
0
11-02-2020, 10:56 PM
(Última modificación: 13-02-2020, 10:41 AM por rakamapi.)
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.
|