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=dressing
将 dressing
的当前值存储在发送到 print
语句的变量 d
中。
it prints "mayo" because the last dressing in the loop is mayo
这就是确切的原因,当稍后执行 lambda
函数时,它采用了 dressing
最后分配的值,在您的情况下恰好是 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: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=dressing
将 dressing
的当前值存储在发送到 print
语句的变量 d
中。
it prints "mayo" because the last dressing in the loop is mayo
这就是确切的原因,当稍后执行 lambda
函数时,它采用了 dressing
最后分配的值,在您的情况下恰好是 mayo
而不是值它在分配时有。