Как обратится к '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_())
