2015-08-21 5 views
0

Я пробую сделать что-то вроде этого.Вставить строку в объект

list = [] 

for i in range(100): 
    list.append("self.label_"+ i) 
for i in list: 
     convetToObject(i)  
     i.setText("Hello") 

Идеи?

+1

ли 'self' уже содержит 100 этикеток или делает то ** convertToObject ** вещь должна создавать их, а? –

+1

Используйте словарь, чтобы связать имя с объектом {"self.label_x": object} dict ["self.label_x"]. SetText ("Hello") –

+1

Реальный вопрос: _why_ вы делаете что-то вроде этого? Я могу в значительной степени гарантировать, что это неправильный способ сделать то, что вы на самом деле пытаетесь достичь. Это пример проблемы [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). – TigerhawkT3

ответ

1

Создание пучка нумерованных строковых переменных и попытка превратить их в ссылки на объекты - это анти-шаблон, который очень, очень редко необходим (см. XY Problem). Вот лучший подход:

self.labels = [] 

for i in range(100): 
    l = Label() 
    l.setText('Hello') 
    self.labels.append(l) 

N.B .: У меня нет опыта работы с PyQT, поэтому детали реализации могут быть разными. Тем не менее, это почти наверняка шаблон дизайна, который вы ищете.

0

Предполагая, что вы работаете в экземпляре self с кучей атрибутов, которые начинаются с 'label_', вы должны быть в состоянии сделать что-то вроде этого, вместо:

labels = [getattr(self, k) for k in dir(self) if k.startswith('label_')] 
for l in labels: 
    l.setText('Hello') 
0

В 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)) 
Смежные вопросы