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".
通过lambda给signal关联的函数传递参数
最新推荐文章于 2022-09-01 21:14:58 发布