0

我有一个项目,我在这个小代码中重新创建了一个问题

from tkinter import *
    
top = Tk()
    
mb=  Menubutton ( top, text="condiments", relief=RAISED )
mb.grid()
mb.menu =  Menu ( mb, tearoff = 0 )
mb["menu"] =  mb.menu

for dressing in ['ketchup','mayo']:
    mb.menu.add_command( label=dressing , command=lambda:print(dressing))

mb.pack()
top.mainloop()

所以在这个例子中,无论我在菜单中选择什么 - 它都会打印“mayo”,因为循环中的最后一个调味品是蛋黄酱,并且循环创建了菜单。

有谁知道如何解决这个问题?

4

1 回答 1

0

尝试这个

from tkinter import *

top = Tk()
    
mb=Menubutton(top,text="condiments",relief=RAISED)
mb.grid()
mb.menu=Menu(mb,tearoff=0)
mb["menu"]=mb.menu

for dressing in ['ketchup','mayo']:
    mb.menu.add_command(label=dressing,command=lambda d=dressing:print(d))

mb.pack()
top.mainloop()

添加d=dressing将 的当前值存储在发送到语句dressing的变量中。dprint

它打印“蛋黄酱”,因为循环中的最后一个调味品是蛋黄酱

这就是确切的原因,当lambda稍后执行该函数时,它采用了dressing在您的情况下恰好是最后一个分配mayo的值,而不是它在分配时的值。

于 2021-02-11T18:30:44.057 回答