2010-03-23 65 views
0

我试图动态地在运行时创建按钮与PyQT4.7的Python:动态属性名称不生成的exec()或eval()函数

但是,这是我的第一个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? 

我假设有一个BASICA语言结构,我缺少允许这样做。因为这是我的第一个程序,请把我很容易;)

回答

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

0

刚分配按钮,一个变量,这样你既可以设置属性并添加小部件。

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

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

+0

的按钮越来越数字排序的名字,但在我正在编写的程序中,他们的全名将从字典中提取,因此我不确定如何使用您的示例不用智能名称跟踪它们。 – PyNewbie27 2010-03-23 02:37:23

+0

将按钮存储在字典中? – FogleBird 2010-03-23 02:54:03

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

在这种情况下