【问题标题】:Problem with python tkinter optionmenu: selecting just the last itempython tkinter optionmenu的问题:只选择最后一项
【发布时间】:2019-05-03 17:53:23
【问题描述】:

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

有人能帮我找出问题所在吗?

【问题讨论】:

标签: python tkinter optionmenu


【解决方案1】:

如果您在for 循环中使用 lambda,那么您可能必须先将值分配给变量,然后才能在 lambda 中使用它:

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

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

如果没有这个,所有 lambdas 都会使用对内存中同一位置的引用 - name - 并在您单击按钮/菜单时获取值。但是当您单击按钮/菜单时,name 具有来自 for 循环的最后一个值 - 所以所有按钮/菜单都使用相同的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-08
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    • 2021-04-29
    相关资源
    最近更新 更多