Re: [PyQt] What is difference between partial and lambda in connect slot?

2011-08-28 Thread Phil Thompson
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?

2011-08-28 Thread Vincent Vande Vyvre


  
  
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