В настоящее время мой код выглядит так:функции 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
в моем коде. Кто-нибудь видит вопиющие ошибки?
[Дублированный] (http://stackoverflow.com/questions/938429/scope-of-python-lambda-functions-and-their-parameters) – Avaris
И как примечание стороны: Подумайте, используя [новый стиль сигналов/слотов] (http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/new_style_signals_slots.html). – Avaris
@Avaris: Я переключил * право * после того, как я разместил свой вопрос. Спасибо за ссылку, однако, я не знал, что для нее есть официальная документация. – Blender