Сначала прочитайте это .Речь идет о lambda x=x: foo(x)
перехвате x даже в цикле for
.
Это окно с меткой и двумя кнопками, сгенерированными в цикле for
.Когда кнопка нажата, ее название появляется в метке.
Если мы используем обычный lambda: label.setText("button -- " + str(i))
, то результат будет последним i
в цикле, независимо от того, какая кнопка нажата:
И это правильно.
Когда мы изменяем на lambda i=i: label.setText("button -- " + str(i))
(фрагмент) и ожидаем, что теперь все будет хорошо, результат будет следующим:
False!
Откуда это False
?
import sys
from PyQt4.QtGui import *
class MainWindow(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
vbox = QVBoxLayout(self)
# label for action
label = QLabel('')
vbox.addWidget(label)
# adding buttons
for i in range (1, 3):
btn = QPushButton(str(i))
btn.clicked.connect( lambda i=i: label.setText("button " + str(i)) )
vbox.addWidget(btn)
app = QApplication(sys.argv)
myapp = MainWindow()
myapp.show()
sys.exit(app.exec_())
Почему это решение не работает так, как должно быть?Что означает false
?
Я знаю, что вы можете сделать foo_factory
, как в первой ссылке, но вопрос в том, что не так с lambda i=i: foo(i)