如果我运行以下代码:
def handleButtonClicked(button_name):
print(button_name)
for button_name in ['A','B']:
if button_name == 'A':
buttons[button_name].button.clicked.connect(lambda: handleButtonClicked(button_name='A'))
if button_name == 'B':
buttons[button_name].button.clicked.connect(lambda: handleButtonClicked(button_name='B'))
然后单击按钮A,然后单击按钮B,根据需要,输出为“ A”,然后为“ B”。但是如果我有代码:
for button_name in ['A','B']:
buttons[button_name].button.clicked.connect(lambda: handleButtonClicked(button_name=button_name))
单击任一按钮将输出'B',因为它是传递给lambda的button_name的最后一个值!为什么是这样? (我知道第一种方法有效,我只是好奇为什么会发生这种情况,以及是否有解决方案)。然后lambda中的函数使用变量本身而不是值,从而传递其最后一个值吗?我该如何将字符串“变量”复制到自己的“常量”中,以便像第二个代码片段一样在一行中完成?
答案 0 :(得分:1)
我建议使用functools.partial
:
from functools import partial
for button_name in ['A', 'B']:
f = partial(handleButtonClicked, button_name=button_name)
buttons[button_name].button.clicked.connect(f)
它返回一个可调用对象,该对象内部使用创建时设置的参数调用handleButtonClicked
。