Python: генерация динамического имени атрибута без exec () или eval () - PullRequest
0 голосов
/ 23 марта 2010

Я пытаюсь динамически создавать кнопки во время выполнения с PyQT4.7

Однако, это моя первая программа на Python, я не уверен, как получить желаемую функциональность.

Я хотел бы иметь возможность заменить текстовую строку на имя атрибута:

т.е.

for each in xrange(4):
    myname = "tab1_button%s" % each  #tab1_button0, tab1_button1, tab1_button2

    #self.ui.tab1_button0 = QtGui.QPushButton(self.ui.tab) <--normal code to create a named button
     setattr(self.ui,myname,QtGui.QPushButton(self.ui.tab)) #rewrite of line above to dynamicly generate a button

#here's where I get stuck. this code isn't valid, but it shows what i want to do
     self.ui.gridLayout.addWidget(self.ui.%s) % myname
#I need to have %s be tab1_button1, tab1_button2, etc. I know the % is for string substituion but how can I substitute the dynamically generated attribute name into that statement?

Я предполагаю, что мне не хватает базовой языковой конструкции, которая позволяет это.Так как это моя первая программа, пожалуйста, успокойся со мной;)

Ответы [ 3 ]

3 голосов
/ 23 марта 2010

Если я правильно истолковал это, я думаю, что вы хотите это:

self.ui.gridLayout.addWidget(getattr(self.ui,myname))

Давай. В Python следующие два утверждения функционально эквивалентны (по ссылке ниже):

value = obj.attribute
value = getattr(obj, "attribute-name")

Для дополнительного контекста:

http://effbot.org/zone/python-getattr.htm

0 голосов
/ 23 марта 2010

Я думаю, что вам может пригодиться знание списков (обычно называемых массивами на других языках)

self.buttons = [None, None, None, None]
for each in xrange(4):
     self.buttons[each] = QtGui.QPushButton(self.ui.tab)
     self.ui.gridLayout.addWidget(self.buttons[each])

Для учебника по спискам Python: http://effbot.org/zone/python-list.htm

0 голосов
/ 23 марта 2010

Просто назначьте кнопку переменной, чтобы вы могли установить атрибут и добавить виджет.

for i in range(4):
    name = 'button%d' % i
    button = QtGui.QPushButton(...)
    setattr(self, name, button)
    self.ui.gridLayout.addWidget(button)

Лично я бы добавил кнопки в список вместо того, чтобы давать им разные имена.

...