Python 3.x 基于固定参数函数调用的Tkinter级联菜单
我想创建一个动态创建一次的级联菜单,它意味着根据收到的参数构建一个新窗口。但是,似乎使用带有参数的lambda函数会导致对参数进行软编码。创建菜单后,我希望它保持硬编码 请参见以下示例: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)
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