лямбда i = i: foo (i) цикл for не работает - PullRequest
4 голосов
/ 28 мая 2011

Сначала прочитайте это .Речь идет о lambda x=x: foo(x) перехвате x даже в цикле for.

Это окно с меткой и двумя кнопками, сгенерированными в цикле for.Когда кнопка нажата, ее название появляется в метке.

Если мы используем обычный lambda: label.setText("button -- " + str(i)), то результат будет последним i в цикле, независимо от того, какая кнопка нажата:
lambda:foo(i)
И это правильно.

Когда мы изменяем на lambda i=i: label.setText("button -- " + str(i)) (фрагмент) и ожидаем, что теперь все будет хорошо, результат будет следующим:
lambda i=i:foo(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)

Ответы [ 2 ]

4 голосов
/ 28 мая 2011

У меня не установлен PyQt4 для тестирования в этот самый момент, но мне кажется ясным, что когда вызывается ваш лямбда-колбэк, ему дается аргумент. i тогда равно значению аргумента вместо значения по умолчанию. Попробуйте это и скажите мне, если это работает (или, по крайней мере, это меняет вывод):

btn.clicked.connect( lambda throw_away=0, i=i: label.setText("button " + str(i)) )
2 голосов
/ 28 мая 2011

Сигнал «нажал» передает логический аргумент в подключенный лямбда-слот.
Документация

То, что вы пытаетесь выполнить, лучше сделать так:

btn.clicked.connect( lambda clicked, i=i : label.setText("button " + str(i)) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...