我正在尝试使用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?
我假设有一种我缺少的基础语言构造允许这样做。因为这是我的第一个项目,请放轻松我;)
答案 0 :(得分:3)
如果我正确地解释了这一点,我想你想要的是:
self.ui.gridLayout.addWidget(getattr(self.ui,myname))
放手一搏。在Python中,以下两个语句在功能上是等效的(来自下面的链接):
value = obj.attribute
value = getattr(obj, "attribute-name")
有关额外背景:
答案 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