【发布时间】:2011-11-18 07:58:19
【问题描述】:
我在 PyQT 中使用一组动态创建的按钮时遇到了一些问题。
我正在使用一个列表来创建对应于不同值的按钮。因为每个按钮都不同,我需要让它们将参数传递给“Button Clicked”函数,分别标识它们自己,这样我就可以对它们执行不同的操作。这是我目前所拥有的:
for x in self.buttons:
name = str(x)
button = QtGui.QPushButton(Frame)
button.setText(name)
cp_result = self.changeProject(name)
if cp_result is None:
print 'changeProject(%s) is None!', name
else:
print 'changeProject(%s) is OK (%r)', name, cp_result
#button.clicked.connect(cp_result)
setattr(self, "btn_%s" % name, button)
self.btnList.append(button)
def changeProject(self, name):
for x in self.btnList:
if x.isDown:
#Change UI Frame to blahblah
return 'A String'
与 Alex 合作,这是最新的代码,测试 changeProject 上的返回值,这显然不能是字符串,但我仍然需要确定在自动生成的按钮之间按下了哪个按钮。
当前错误:TypeError: connect() slot argument should be a callable or a signal, not 'str'
【问题讨论】:
-
啊啊!数组是有史以来最基本的数据结构之一,甚至包含在最原始的语言中,但有些人没有使用它们,最终以一种慢得要命、非常不雅和愚蠢的方式复制它们(即,通过滥用 @987654323 @/
exec)。另外,错误信息很清楚,不是吗?self.changeProject("x")的结果是 None - 找出原因并修复它。 -
我读到了关于寻找一种基于列表创建动态变量的方法,而 exec 似乎是一种流行的选择。有没有更好的办法?此外,self.changeProject("x") 的结果是一个字符串。
-
真正的解决方案不是动态创建变量(在 99% 的情况下,我并不完全谴责它)。几乎总是,你真的想要一个映射(即 dict)。不仅快很多倍,而且方法正确,不可能与不相关的变量发生冲突,而且更容易跟踪。