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

0 投票
3 回答
953 浏览
提问于 2025-04-15 20:43

我正在尝试用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")

补充一下背景信息:

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

撰写回答