[PyQt] What is difference between "partial" and "lambda" in connect slot?
Phil Thompson
phil at riverbankcomputing.com
Sun Aug 28 16:32:36 BST 2011
On Sun, 28 Aug 2011 22:11:02 +0900, bluekyu <bluekyu.dev at 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
More information about the PyQt
mailing list