通过lambda给signal关联的函数传递参数

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_()


#http://www.riverbankcomputing.com/pipermail/pyqt/2011-August/030465.html
##> 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".


你可能感兴趣的:(String,layout,lambda,import,button)