我有一个来自this link的以下代码:
from tkinter import *
from tkinter.filedialog import askdirectory
import os
def onEnterDir(dropdown, var):
path = askdirectory()
if not path:
return
filenames = os.listdir(path)
dropdown.configure(state='active') # Enable drop down
menu = dropdown['menu']
# Clear the menu.
menu.delete(0, 'end')
for name in filenames:
# Add menu items.
menu.add_command(label=name, command=lambda: var.set(name))
root = Tk()
dropdownVar = StringVar()
dropdown = OptionMenu(root, dropdownVar, "Select SED...")
dropdown.grid(column=0, row=1)
dropdown.configure(state="disabled")
b = Button(root, text='Change directory',
command=lambda: onEnterDir(dropdown, dropdownVar))
b.grid(column=1, row=1)
root.mainloop()
运行程序后,我们将获得一个GUI,可以在其中选择目录,然后其内容显示在选项菜单中。当我们选择其中一项时,只会选择最后一项。
有人可以帮我弄清楚问题是什么吗?
答案 0 :(得分:1)
如果您在for
循环中使用lambda,则可能必须先在lambda中使用变量之前为其赋值:
command=lambda x=name: var.set(x)
这样,每个lambda
都有自己的变量x
,其值不同于name
。
没有这些,所有的lambda都使用对内存中同一位置的引用-name
-单击按钮/菜单即可获得价值。但是,当您单击按钮/菜单时,name
具有for
循环中的最后一个值-因此所有按钮/菜单都使用相同的值。