python tkinter optionmenu问题:仅选择最后一项

时间:2019-05-03 17:53:23

标签: python tkinter optionmenu

我有一个来自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,可以在其中选择目录,然后其内容显示在选项菜单中。当我们选择其中一项时,只会选择最后一项。

有人可以帮我弄清楚问题是什么吗?

1 个答案:

答案 0 :(得分:1)

如果您在for循环中使用lambda,则可能必须先在lambda中使用变量之前为其赋值:

command=lambda x=name: var.set(x)

这样,每个lambda都有自己的变量x,其值不同于name

没有这些,所有的lambda都使用对内存中同一位置的引用-name-单击按钮/菜单即可获得价值。但是,当您单击按钮/菜单时,name具有for循环中的最后一个值-因此所有按钮/菜单都使用相同的值。