[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