Проблема с python tkinter optionmenu: выбор только последнего элемента - PullRequest
0 голосов
/ 03 мая 2019

У меня есть код из этой ссылки :

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()

После запуска программы мы получаем графический интерфейс, в котором мы можем выбрать каталог, после чего его содержимое отображается в меню параметров. Когда мы выбираем один из элементов, выбирается только последний элемент.

Кто-нибудь поможет мне выяснить, в чем проблема?

1 Ответ

1 голос
/ 04 мая 2019

Если вы используете лямбду в цикле for, возможно, вам придется присвоить значение переменной, прежде чем использовать ее внутри лямбды:

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

Таким образом, каждый lambda имеет собственную переменную x, значение которой отличается от name.

Без этого все лямбды используют ссылку на одно и то же место в памяти - name - и получают значение при нажатии кнопки / меню. Но когда вы нажимаете кнопку / меню, name имеет последнее значение из цикла for - поэтому все кнопки / меню используют одно и то же значение.

...