Python:没有exec()或eval()的动态属性名称生成

时间:2010-03-23 02:23:40

标签: python pyqt4

我正在尝试使用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 个答案:

答案 0 :(得分:3)

如果我正确地解释了这一点,我想你想要的是:

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

放手一搏。在Python中,以下两个语句在功能上是等效的(来自下面的链接):

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

有关额外背景:

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

答案 1 :(得分:0)

只需将按钮分配给变量,即可设置属性并添加小部件。

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

我个人会将按钮添加到列表中,而不是给它们不同的名称。

答案 2 :(得分:0)

我认为你可能会受益于列表的知识(通常称为其他语言的数组)

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