Python 3.x 基于固定参数函数调用的Tkinter级联菜单

Python 3.x 基于固定参数函数调用的Tkinter级联菜单,python-3.x,tkinter,Python 3.x,Tkinter,我想创建一个动态创建一次的级联菜单,它意味着根据收到的参数构建一个新窗口。但是,似乎使用带有参数的lambda函数会导致对参数进行软编码。创建菜单后,我希望它保持硬编码 请参见以下示例: from tkinter import * def print_number(num): print(num) root = Tk() menubar = Menu(root) cascade_menu = Menu(menubar, tearoff=0) for ii in range(0, 5)

我想创建一个动态创建一次的级联菜单,它意味着根据收到的参数构建一个新窗口。但是,似乎使用带有参数的lambda函数会导致对参数进行软编码。创建菜单后,我希望它保持硬编码

请参见以下示例:

from tkinter import *

def print_number(num):
    print(num)

root = Tk()
menubar = Menu(root)
cascade_menu = Menu(menubar, tearoff=0)
for ii in range(0, 5):
    cascade_menu.add_command(label=str(ii), command=lambda: print_number(ii))

menubar.add_cascade(label="Number printer", menu=cascade_menu)

root.config(menu=menubar)
root.mainloop()
这将创建一个带有一个级联菜单的小窗口,其中包含条目0、1、2、3、4。我想单击0,并在控制台上打印0,其他数字也一样。但是因为ii被定义为4,所以每个命令都只打印4。这是因为命令是用变量ii调用的,而不是用分配命令时该变量的值调用的,这是我的首选

有解决办法吗?我已尝试声明lambda函数列表,但问题仍然存在。我尝试过使用eval函数,但它也无法解决实际版本的问题,因为显然我需要将另一个结构作为参数传递,而调用eval时找不到该结构。我正在考虑的另一种方法是使用脚本编写一个大文件,其中有效地包含函数声明,例如:

def print1():
    print_number(1)
def print2():
    print_number(2)
等等。但这将是非常麻烦的


我正在windows中使用python 3.7。

问题在于lambda函数使用类似lambda x=myvar:functionx的格式,其中lambda函数被强制重新分配并使用函数中的变量。以下代码应该可以工作:

from tkinter import *

def print_number(num):
    print(num)

root = Tk()
menubar = Menu(root)
cascade_menu = Menu(menubar, tearoff=0)
for ii in range(0, 5):
    cascade_menu.add_command(label=str(ii), command=lambda ii=ii: print_number(ii))

menubar.add_cascade(label="Number printer", menu=cascade_menu)

root.config(menu=menubar)
root.mainloop()
希望这有帮助

通过命令强制关闭=lambda i=ii:print_numberi