通过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".


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值