4

我正在尝试使用 for 循环将多个编号命令添加到 Tkinter 菜单。当调用命令时,它的编号应该用作命令函数的参数。以下代码不起作用,因为 i 在调用命令时被评估,这是在循环完成之后。这意味着传递给 function1 的参数始终为 15,而我打算传递命令标签上显示的数字。有没有办法做到这一点?

注意:标签按预期工作,产生 16 个标记为 0 到 15 的选项

newMenu = Menu(menuButtonInstance)
for i in range(16):
    newMenu.add_command(label = '%s'%i,
                        command = lambda:function1(i))
menuButtonInstance.config(menu = newMenu)

提前致谢

4

1 回答 1

4

处理 的后期绑定的一种常用方法lambda是为 lambda 提供一个参数,该参数设置为更改变量的默认值:

    newMenu.add_command(label='{0}'.format(i),
                        command=lambda x=i: function1(x))

另一种可能性是使用partialfrom functools

    newMenu.add_command(label='{0}'.format(i),
                        command=partial(function1, i))

(请注意,PEP8建议不要在关键字参数中使用时的每一侧都使用空格字符=。另一方面,您应该在所有运算符周围放置空格字符,就像%在您的示例中一样)

于 2012-06-18T08:09:01.590 回答