Re: [PyQt] What is difference between partial and lambda in connect slot?
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 listPyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt
Re: [PyQt] What is difference between partial and lambda in connect slot?
Le 28/08/11 15:11, bluekyu a crit: 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"? ___ PyQt mailing list PyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt Your's lambda function is not correct. Use this: form.connect(button, SIGNAL("clicked()"), lambda s=string: label.setText(s)) -- Vincent V.V. Oqapy . Qarte+7 . PaQager ___ PyQt mailing listPyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt