On Sun, 28 Aug 2011 22:11:02 +0900, bluekyu <bluekyu....@gmail.com> wrote: > Hello. I have a question about "partial" and "lambda" in connect slot. > > I learned that "partial" and "lambda" can have arguments in connect slot. > So, I usually use lambda function, however, it does not work well in > some code. > > My example code: > -------------------------------------------- > from PyQt4.QtCore import * > from PyQt4.QtGui import * > import sys > from functools import partial > > app = QApplication(sys.argv) > form = QDialog() > layout = QVBoxLayout() > > label = QLabel("Test") > layout.addWidget(label) > > stringList = ["ABC", "123", "XYZ", "789"] > for string in stringList: > button = QPushButton(string) > layout.addWidget(button) > form.connect(button, SIGNAL("clicked()"), > # lambda: label.setText(string)) # Problem > partial(label.setText, string)) > > form.setLayout(layout) > form.show() > app.exec_() > --------------------------------------------- > > I expected that each button set label text as each string, but all > button set label text as "789". > Instead, partial function works very well. > > What is difference between "partial" and "lambda"?
partial is a function and so its arguments are evaluated each time it is called. In other words each time partial() is called "string" has a different value. lambda just returns a code block that is evaluated when the button is clicked. The value of string, by that time, will be "789". Phil _______________________________________________ PyQt mailing list PyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt