tkinter python - 菜单按钮不适用于循环

tkinter python - menu button doesnt work with a loop

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

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”,因为循环中的最后一个敷料是蛋黄酱并且循环创建了菜单。

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

试试这个

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=dressingdressing 的当前值存储在发送到 print 语句的变量 d 中。

it prints "mayo" because the last dressing in the loop is mayo

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