2012-05-16 5 views
4

В настоящее время мой код выглядит так:функции Lambda и переменная сфера

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 

Я проверил на уникальность control и func каждый петлевой напечатав выход id(control) и id(func), и все они вернулись уникальный Num Берс. Кроме того, control.objectName() - это правильное имя объекта.

У меня такое ощущение, что это проблема с переменной областью видимости, поскольку я обычно не часто использую lambda в моем коде. Кто-нибудь видит вопиющие ошибки?

+0

[Дублированный] (http://stackoverflow.com/questions/938429/scope-of-python-lambda-functions-and-their-parameters) – Avaris

+1

И как примечание стороны: Подумайте, используя [новый стиль сигналов/слотов] (http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/new_style_signals_slots.html). – Avaris

+0

@Avaris: Я переключил * право * после того, как я разместил свой вопрос. Спасибо за ссылку, однако, я не знал, что для нее есть официальная документация. – Blender

ответ

2

SPLAT.

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

Это решает проблему, спасибо! – Blender