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 使用相同的值。
我有一个来自 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 使用相同的值。