TKINTER CASCADE菜单基于固定的参数功能调用



我想创建一个动态创建一次的级联菜单,它的目的是基于收到的参数构建一个新窗口。但是,似乎将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。此Si是因为使用变量ii调用该命令,而不是该变量分配时具有该变量的值,这是我更喜欢的。p>对此有任何解决方法吗?我已经尝试声明lambda函数列表,但问题仍然存在。我已经尝试使用eval函数,但也没有在问题的真实版本上解决该问题,因为显然我需要将另一个结构作为参数传递,而在调用eval时找不到。我正在考虑的替代方法是使用脚本编写一个有效包含函数声明的大文件,例如:

def print1():
    print_number(1)
def print2():
    print_number(2)

等等。但这将非常麻烦。

我正在与Windows中的Python 3.7合作。

问题是lambda函数使用诸如 lambda x=myvar: function(x)的格式,其中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()

希望这会有所帮助!

最新更新