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

Problem with python tkinter optionmenu: selecting just the last item

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

谁能帮我找出问题所在?

如果您在 for 循环中使用 lambda,那么在 lambda 中使用它之前,您可能必须先给变量赋值:

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

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

如果没有这个,所有 lambda 都使用对内存中相同位置的引用 - name - 并在您单击 button/menu 时获取值。但是,当您单击 button/menu 时,name 具有来自 for 循环的最后一个值 - 因此所有 buttons/menu 使用相同的值。