Python:无需exec()或eval()的动态属性名称生成
我正在尝试用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
你只需要把按钮赋值给一个变量,这样你就可以同时设置它的属性和添加这个小部件。
for i in range(4):
name = 'button%d' % i
button = QtGui.QPushButton(...)
setattr(self, name, button)
self.ui.gridLayout.addWidget(button)
我个人觉得把按钮放到一个列表里会更好,而不是给它们起不同的名字。
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
3
如果我理解得没错,你想要的是这个:
self.ui.gridLayout.addWidget(getattr(self.ui,myname))
试试看这个。在Python中,下面这两条语句的功能是一样的(来自下面的链接):
value = obj.attribute
value = getattr(obj, "attribute-name")
补充一下背景信息: