Вы встречаете то, что часто упоминается (может быть, не совсем педантически-правильно ;-) как «проблема с ограничением объема» в Python - привязка запаздывает (лексический поиск во время вызова), в то время как вы хотели бы рано (по умолчанию). Итак, где у вас сейчас есть:
for item in menuitems:
entry = menu.addAction(item)
self.connect(entry,QtCore.SIGNAL('triggered()'), lambda: self.doStuff(item))
попробуйте вместо:
for item in menuitems:
entry = menu.addAction(item)
self.connect(entry,QtCore.SIGNAL('triggered()'), lambda item=item: self.doStuff(item))
Это «предвосхищает» привязку, поскольку значения по умолчанию (как здесь item
) вычисляются один раз для всех в def-time. Добавление одного уровня вложенности функций (например, двойной лямбды) тоже работает, но это немного излишне! -)
Вы могли бы альтернативно использовать functools.partial(self.doStuff, item)
(с import functools
наверху, конечно), что является еще одним хорошим решением, но я думаю, что я бы выбрал самое простое (и наиболее распространенное) "поддельное значение по умолчанию для аргумента "идиома.