Я пробую сделать что-то вроде этого.Вставить строку в объект
list = []
for i in range(100):
list.append("self.label_"+ i)
for i in list:
convetToObject(i)
i.setText("Hello")
Идеи?
Я пробую сделать что-то вроде этого.Вставить строку в объект
list = []
for i in range(100):
list.append("self.label_"+ i)
for i in list:
convetToObject(i)
i.setText("Hello")
Идеи?
Создание пучка нумерованных строковых переменных и попытка превратить их в ссылки на объекты - это анти-шаблон, который очень, очень редко необходим (см. XY Problem). Вот лучший подход:
self.labels = []
for i in range(100):
l = Label()
l.setText('Hello')
self.labels.append(l)
N.B .: У меня нет опыта работы с PyQT, поэтому детали реализации могут быть разными. Тем не менее, это почти наверняка шаблон дизайна, который вы ищете.
Предполагая, что вы работаете в экземпляре self
с кучей атрибутов, которые начинаются с 'label_'
, вы должны быть в состоянии сделать что-то вроде этого, вместо:
labels = [getattr(self, k) for k in dir(self) if k.startswith('label_')]
for l in labels:
l.setText('Hello')
В Python 3 вы можете использовать встроенные в функции exec()
для выполнения строки, содержащей python-code, в python 2.7. Я думаю, что оператор exec может сделать то же самое. Вот exampe в Python 3, pyqt5:
for i in range(25):
n = i + 1
on = 'label_{}'.format(n) # the name of the object
src = 'self.{} = QtWidgets.Qlabel()'.format(on) # string to create the object
exec(src) # execute the code
либо установить текст в этом цикле
src = 'self.{}.setText("{}")'.format(on,n)
exec(src)
или установить ObjectName для доступа к объекту позже:
src = 'self.{0}.setObjectName("{0}")'.format(on)
exec(src)
Я добавил объектов в QVBoxLayout, иначе вам нужно установить родительский элемент в строке, создающей объект
src = 'self.layout.addWidget(self.{})'.format(on)
exec(src)
пример для последующего установления текста:
for i in range(25):
n = i + 1
on = 'label_{}'.format(n)
label = self.findChild(QtWidgets.QLabel,on)
label.setText(str(n))
ли 'self' уже содержит 100 этикеток или делает то ** convertToObject ** вещь должна создавать их, а? –
Используйте словарь, чтобы связать имя с объектом {"self.label_x": object} dict ["self.label_x"]. SetText ("Hello") –
Реальный вопрос: _why_ вы делаете что-то вроде этого? Я могу в значительной степени гарантировать, что это неправильный способ сделать то, что вы на самом деле пытаетесь достичь. Это пример проблемы [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). – TigerhawkT3