Change QLabel text dynamically in PyQt4

47,780

Solution 1

You are not using the modules created by pyuic correctly. You should never directly edit these modules - they should imported into your main application.

The UI classes that pyuic generates have a setupUi method. This method takes an instance of the top-level class that you created in Qt Designer, and it will add all the widgets from designer to that instance. So label_nombre, for example, would become an attribute of the instance passed to setupUi. Usually, you will create a subclass of the top-level class, and then pass in self as the instance (see below).

I would suggest that you re-generate your ui files with pyuic and save them as, say dialog_ui.py and dashboard_ui.py.

The structure of your program would then become something like this:

from PyQt4 import QtCore, QtGui
from dashboard_ui import Ui_dashboard
from dialog_ui import Ui_Dialog

class logica_login(QtGui.QDialog, Ui_Dialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        self.setupUi(self)
        self.bloguin_aceptar.clicked.connect(self.validacion)
        self.blogin_cancelar.clicked.connect(self.reject)

    def validacion(self):
        ...

class logica_tablero(QtGui.QMainWindow, Ui_dashboard):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.setupUi(self)
        self.label_nombre.setText("hola")
        ...

if __name__ == "__main__":

    app = QtGui.QApplication(sys.argv)
    login = logica_login()
    if login.exec_() == QtGui.QDialog.Accepted:
        dashboard = logica_tablero()
        dashboard.showMaximized()
        sys.exit(app.exec_())

Solution 2

Replace this line in logica_tablero:

self.ui.self.label_nombre.setText("hola")

with this:

self.ui.label_nombre.setText("hola")
Share:
47,780
n3rio
Author by

n3rio

Updated on August 02, 2020

Comments

  • n3rio
    n3rio almost 4 years

    My question is: how can I change the text in a label? The label is inside a layout, but setText() does not seem to work - maybe I am not doing it right.

    Here is my code:

    this is the Main windows GUI, the one Qt-Designer gives:

    class Ui_dashboard(QtGui.QMainWindow):
    def setupUi(self, dashboard):
        dashboard.setObjectName(_fromUtf8("dashboard"))
        dashboard.resize(734, 703)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(_fromUtf8("../../../../Documents and Settings/cgarcia/Escritorio/metromara - imagenes - nerio/logoM.JPG")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        dashboard.setWindowIcon(icon)
        dashboard.setWindowOpacity(1.0)
        self.centralwidget = QtGui.QWidget(dashboard)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.frame = QtGui.QFrame(self.centralwidget)
        self.frame.setGeometry(QtCore.QRect(30, 20, 261, 119))
        self.frame.setFrameShape(QtGui.QFrame.Box)
        self.frame.setFrameShadow(QtGui.QFrame.Plain)
        self.frame.setObjectName(_fromUtf8("frame"))
        self.gridLayout = QtGui.QGridLayout(self.frame)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.label_5 = QtGui.QLabel(self.frame)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.label_5.setFont(font)
        self.label_5.setObjectName(_fromUtf8("label_5"))
        self.gridLayout.addWidget(self.label_5, 4, 0, 1, 1)
        self.label_4 = QtGui.QLabel(self.frame)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.label_4.setFont(font)
        self.label_4.setObjectName(_fromUtf8("label_4"))
        self.gridLayout.addWidget(self.label_4, 3, 0, 1, 1)
        self.label_ci = QtGui.QLabel(self.frame)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.label_ci.setFont(font)
        self.label_ci.setObjectName(_fromUtf8("label_ci"))
        self.gridLayout.addWidget(self.label_ci, 1, 1, 1, 1)
        self.label_cargo = QtGui.QLabel(self.frame)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.label_cargo.setFont(font)
        self.label_cargo.setObjectName(_fromUtf8("label_cargo"))
        self.gridLayout.addWidget(self.label_cargo, 2, 1, 1, 1)
        self.label_gerencia = QtGui.QLabel(self.frame)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.label_gerencia.setFont(font)
        self.label_gerencia.setObjectName(_fromUtf8("label_gerencia"))
        self.gridLayout.addWidget(self.label_gerencia, 3, 1, 1, 1)
        self.label_nombre = QtGui.QLabel(self.frame)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.label_nombre.setFont(font)
        self.label_nombre.setObjectName(_fromUtf8("label_nombre"))
        self.gridLayout.addWidget(self.label_nombre, 0, 1, 1, 1)
        self.label_2 = QtGui.QLabel(self.frame)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.label_2.setFont(font)
        self.label_2.setObjectName(_fromUtf8("label_2"))
        self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
        self.label = QtGui.QLabel(self.frame)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setObjectName(_fromUtf8("label"))
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        self.label_3 = QtGui.QLabel(self.frame)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.label_3.setFont(font)
        self.label_3.setObjectName(_fromUtf8("label_3"))
        self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)
        self.label_departamento = QtGui.QLabel(self.frame)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.label_departamento.setFont(font)
        self.label_departamento.setObjectName(_fromUtf8("label_departamento"))
        self.gridLayout.addWidget(self.label_departamento, 4, 1, 1, 1)
        self.treeView = QtGui.QTreeView(self.centralwidget)
        self.treeView.setGeometry(QtCore.QRect(30, 160, 161, 481))
        self.treeView.setFrameShape(QtGui.QFrame.Box)
        self.treeView.setFrameShadow(QtGui.QFrame.Plain)
        self.treeView.setObjectName(_fromUtf8("treeView"))
        dashboard.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(dashboard)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 734, 20))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        dashboard.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(dashboard)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        dashboard.setStatusBar(self.statusbar)
    
        self.retranslateUi(dashboard)
        QtCore.QMetaObject.connectSlotsByName(dashboard)
    
    def retranslateUi(self, dashboard):
        dashboard.setWindowTitle(_translate("dashboard", "Metro de Maracaibo.", None))
        self.label_5.setText(_translate("dashboard", "DEPARTAMENTO", None))
        self.label_4.setText(_translate("dashboard", "GERENCIA", None))
        self.label_ci.setText(_translate("dashboard", "...", None))
        self.label_cargo.setText(_translate("dashboard", "...", None))
        self.label_gerencia.setText(_translate("dashboard", "...", None))
        self.label_nombre.setText(_translate("dashboard", "...", None))
        self.label_2.setText(_translate("dashboard", "C.I.:", None))
        self.label.setText(_translate("dashboard", "NOMBRE", None))
        self.label_3.setText(_translate("dashboard", "CARGO", None))
        self.label_departamento.setText(_translate("dashboard", "...", None))
    

    this is the logic of the interfaces:

    class logica_login(Ui_Dialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        #QtGui.QMainWindow.__init__(self)
        Dialog = Ui_Dialog(self)
        self.setupUi(Dialog)
        self.bloguin_aceptar.clicked.connect(self.validacion)
        self.blogin_cancelar.clicked.connect(self.reject)
        Dialog.show()
        Dialog.exec_()
        #PRINT DE PRUEBA
        print('hola')
    
    #METODO DE VALIDACION
    #####################
    def validacion(self):
        #CONEXION A LA BASE DE DATOS.
        #############################
        db = QSqlDatabase.addDatabase("QPSQL")
        db.setHostName("localhost")
        db.setDatabaseName("postgres")
        db.setUserName("postgres")
        db.setPassword("1234")
        #self.ui.label_nombre.setText(str(Ui_Dialog.le_user.text()))
    
        #RESPUESTA EN CASO DE FALLO EN CONEXION CON LA BASE DE DATOS.
        #############################################################
        if not db.open():
            QtGui.QMessageBox.about(self, "ERROR","LO SENTIMOS, EXPERIMENTAMOS PROBLEMAS DE CONEXION CON EL SERVIDOR.")
    
        #CONSULTA A LA BASE DE DATOS DE LA CLAVE Y CONTRASEÑA
        #####################################################
        consulta = QSqlQueryModel()
        consulta.setQuery("SELECT usuario, contraseña, id FROM usuarios")
        lista = []
        i = consulta.rowCount()
    
        #BUCLE DE EXTRACCION Y REORDENACION DE DATOS EN LA LISTA "LISTA"
        ################################################################
        while i >= 0:
            db_user = consulta.record(i).value("usuario");
            db_pass = consulta.record(i).value("contraseña");
            db_id = consulta.record(i).value("id")
            str_user = str(db_user)
            str_pass = str(db_pass)
            auth_db = (str_user, str_pass)
            lista.append(auth_db)
    
            i = (i-1)
            print(lista)
    
        user = self.le_user.text()
        passw = self.le_pass.text()
    
    
    
        for usrname, password in lista:
            if ((user == usrname) and (passw == password)):
                print('logueo exitoso')
                QtGui.QMessageBox.about(self, "Logue Exitoso.", "ACCESO CONCEDIDO.")
                self.deleteLater()
                go = True
                print(go)
                dashboard.showMaximized()
                #self.ui.label_nombre.setText(str(Ui_Dialog.le_user.text())) ### LOGICA_LOGIN NO TIENE ATRIBUTO UI
                break;
            elif ((user == usrname) and (passw != password)):
                QtGui.QMessageBox.about(self, "ERROR","Contraseña Incorrecta.")
                break;
            elif ((user != usrname) and (passw == password)):
                QtGui.QMessageBox.about(self, "ERROR","Nombre de usuario Incorrecto")
                break;
        else:
            QtGui.QMessageBox.about(self, "ERROR","Nombre de usuario y Contraseña Incorrecto")
    
    
    class logica_tablero(Ui_dashboard):
    
    def __init__(self):
        l_n = Ui_dashboard.label_nombre()
        QtGui.QMainWindow.__init__(self)
        self.ui = Ui_dashboard(self)
        self.ui.setupUi(self)
        #logica_tablero.ui.l_n.setText("hola")
        Ui_dashboard.label_5.setText(("hola"))
    
    
    
    def main():
        app = QtGui.QApplication(sys.argv)
        if 1 == 1 :
            loginApp = logica_login()
            loginApp.show()
        else:
            mainApp = Ui_dashboard()
            mainApp.setupUi(dash)
            dash.showMaximized()
            #Ui_dashboard.label_nombre.setText(("hola"))
    
        sys.exit(app.exec_())
    
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        ## ESTA PARTE HA SIDO UN DOLOR DE CABEZA, NO OLVIDAR NI BORRAR.
        #BUCLE DE DASHBOARD
        #---------------------------------
        dashboard = QtGui.QMainWindow()
        mainApp = Ui_dashboard()
        mainApp.setupUi(dashboard)
        #BUCLE DE LOGIN
        #---------------------------------
        l = logica_login()
        l   
        #---------------------------------
        sys.exit(app.exec_())    
    

    I want to change the labels once the user logs in to the program. The label I want to change is label_nombre, and I want to replace it for le_user, which corresponds to one of the QLineEdits.

    UPDATE

    I made all the changes you told me to do, the project is looking pretty much organized, but now i am getting this output:

    TypeError: descriptor 'init' requires a 'sip.simplewrapper' object but received a 'logica_login'

    UPDATE 2

    *TypeError: descriptor 'init' requires a 'sip.simplewrapper' object but received a 'logica_login' -------------------------> SOLVE

    Now, I have the same problem that began this all deal, the label wont change its content.