Python Tkinter:单击菜单中的按钮是具有错误参数的触发函数

Python Tkinter:单击菜单中的按钮是具有错误参数的触发函数,python,python-3.x,user-interface,tkinter,Python,Python 3.x,User Interface,Tkinter,你好 我在为奇怪的自我错误而挣扎,所以我想在级联菜单中有按钮,每个按钮都应该触发函数,并将它们的名称传递给它 代码如下: from tkinter import * def say_hi(name): print(name) root = Tk() menu = Menu(root) root.config(menu=menu) subjects_menu = Menu(menu) menu.add_cascade(label="Subjects", menu=subjects

你好 我在为奇怪的自我错误而挣扎,所以我想在级联菜单中有按钮,每个按钮都应该触发函数,并将它们的名称传递给它

代码如下:

from tkinter import *

def say_hi(name):
    print(name)

root = Tk()

menu = Menu(root)
root.config(menu=menu)

subjects_menu = Menu(menu)
menu.add_cascade(label="Subjects", menu=subjects_menu)

d = ["name1", "name2"]
for name in d:
   subjects_menu.add_command(label=name, command=lambda:say_hi(name))

'''
this is also not working

name = "Math"
subjects_menu.add_command(label=name, command=lambda:say_hi(name))
name = "Physics"
subjects_menu.add_command(label=name, command=lambda:say_hi(name))
'''

root.mainloop()
所以我想在控制台中打印单击按钮的名称,并通过迭代而不是逐个添加按钮(我无法预测它们的数量)

运行程序后,我并没有收到任何错误,窗口显示。无论我点击哪个按钮,控制台都会打印“name2”。 我添加了几个名字——它总是打印最后一个选项的名字


提前感谢

lambda很棘手,但您可以使用lambda参数执行您想要执行的操作:

for name in d:
   subjects_menu.add_command(label=name, command=lambda x=name:say_hi(x))
这应该可以解决您的问题。

另一种(更简洁的)方法是使用
functools。部分

from functools import partial

for name in d:
   subjects_menu.add_command(label=name, command=partial(say_hi, name))

好消息。functools模块中隐藏了很多好东西。我同意“整洁”