4

目前,我的代码是这样的:

for control in self.controls():
  self.connect(control, SIGNAL('clicked()'), lambda: self.button(control.objectName()))

当我运行我的代码时,我的lambda函数将control成为我的元素列表中的最后一个元素,这不是我期望发生的。

奇怪的是,当我手动运行lambda每个循环时,它对每个循环都运行良好,但最终仍然存在与以前相同的问题:

for control in self.controls():
  func = lambda: self.button(control.objectName())
  func() # Prints the correct output

  self.connect(control, SIGNAL('clicked()'), func) # When triggered, still breaks

我的self.button()功能被简单定义:

def button(self, name):
    print name

我通过打印and的输出检查了controlandfunc每个循环的唯一性,它们都返回了唯一的数字。除此之外,是正确的对象名称。id(control)id(func)control.objectName()

我有一种感觉,这是一个变量范围的问题,因为我通常不会lambda在我的代码中经常使用 s。有没有人看到任何明显的错误?

4

1 回答 1

2

啪啪声。

for control in self.controls():
  self.connect(control, SIGNAL('clicked()'), lambda control=control:
    self.button(control.objectName()))
于 2012-05-16T03:04:25.773 回答