Как обратится к 'name' объектов PyQtT через цикл c подменой цифры в имени объекта?

Как обратиться к имени объектов, например label_1, label_2, label_3, где будет перебирать цикл элементы через id переменную self.label_(id).setText...?

Есть у данного способа минусы и посоветуете ли вы так делать?

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

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


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(230, 230)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label_1 = QtWidgets.QLabel(self.centralwidget)
        self.label_1.setGeometry(QtCore.QRect(30, 20, 47, 13))
        self.label_1.setObjectName("label_1")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(30, 40, 47, 13))
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(30, 60, 47, 13))
        self.label_3.setObjectName("label_3")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(30, 80, 47, 13))
        self.label_4.setObjectName("label_4")
        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setGeometry(QtCore.QRect(30, 100, 47, 13))
        self.label_5.setObjectName("label_5")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(20, 130, 181, 41))
        self.pushButton.setObjectName("pushButton")
        self.lineEdit_1 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_1.setGeometry(QtCore.QRect(70, 20, 113, 20))
        self.lineEdit_1.setObjectName("lineEdit_1")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(70, 40, 113, 20))
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_3.setGeometry(QtCore.QRect(70, 60, 113, 20))
        self.lineEdit_3.setObjectName("lineEdit_3")
        self.lineEdit_4 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_4.setGeometry(QtCore.QRect(70, 80, 113, 20))
        self.lineEdit_4.setObjectName("lineEdit_4")
        self.lineEdit_5 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_5.setGeometry(QtCore.QRect(70, 100, 113, 20))
        self.lineEdit_5.setObjectName("lineEdit_5")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 230, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

        self.pushButton.clicked.connect(self.wrt_parametr)

    # как преобразовать функцию ниже в цикл с обращением к имени объектов?
    def wrt_parametr(self):
        self.label_1.setText(self.lineEdit_1.text())
        self.label_2.setText(self.lineEdit_2.text())
        self.label_3.setText(self.lineEdit_3.text())
        self.label_4.setText(self.lineEdit_4.text())
        self.label_5.setText(self.lineEdit_5.text())
        #for id in range(5):
            #self.label_(id).setText(self.lineEdit_(id).text())

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label_1.setText(_translate("MainWindow", "1"))
        self.label_2.setText(_translate("MainWindow", "2"))
        self.label_3.setText(_translate("MainWindow", "3"))
        self.label_4.setText(_translate("MainWindow", "4"))
        self.label_5.setText(_translate("MainWindow", "5"))
        self.pushButton.setText(_translate("MainWindow", "Присвоить значения"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: S. Nick

Мои вам советы:

  • не изменяйте код, сгенерированный Qt Designer. Создайте другой класс, который наследуется от соответствующего виджета, и используйте созданный класс для его заполнения.

  • для динамического создания переменных, Qt Designer вам не помощник.

  • делайте так, чтобы вам было понятно, что вы делаете.

Вы можете использовать setattr() / getattr() для динамического создания переменных, используя строку, как показано ниже:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


class MainWindow(QtWidgets.QMainWindow): 
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        
        self.centralWidget = QtWidgets.QWidget()
        self.setCentralWidget(self.centralWidget)
        
        flay = QFormLayout(self.centralWidget)
        self.texts = [
            ["name", "какое-то имя"], 
            ["address", "какой-то адрес"], 
            ["phone", "какой-то телефон"],
            ["email", "какой-то email"],
            ["Заметки", "какие-то Заметки"]
        ]

        for i, text in enumerate(self.texts):
            self.label = QLabel(text[0]+": ")
            self.lineEdit = QLineEdit(placeholderText=text[1])
            flay.addRow(self.label, self.lineEdit)

            # Атрибут класса создается с помощью setattr()                          # !!!
            setattr(self, "label_{}".format(i+1), self.label)                       # !
            setattr(self, "lineEdit_{}".format(i+1), self.lineEdit)                 # !

        flay.addRow(QPushButton("Click me", clicked=self.create_txt)) 
        
        # использование с помощью getattr() так:                                                        # !!!
        for i, _ in enumerate(self.texts):
            obj = getattr(self, "lineEdit_{}".format(i+1))                          # !!         
            obj.editingFinished.connect(lambda obj=obj: self.editing_finished(obj)) # 
            obj.textChanged.connect(lambda text, obj=obj: obj.setStyleSheet(''))    #

    def create_txt(self):
        for i, _ in enumerate(self.texts):
            obj_label = getattr(self, "label_{}".format(i+1))               # !!!
            obj_edit = getattr(self, "lineEdit_{}".format(i+1))             # !!!
            obj_label.setText(f'{_[0]}: {obj_edit.text()}')

    def editing_finished(self, obj):
        # использовать можно и так:
        self.lineEdit_1.setStyleSheet('')
        self.lineEdit_2.setStyleSheet('')
        self.lineEdit_3.setStyleSheet('')
        self.lineEdit_4.setStyleSheet('')
        self.lineEdit_5.setStyleSheet('')
        
        obj.setStyleSheet('background: green; color: #fff')                 # !!!
            

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.resize(250, 230)
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка