Tkinter选项菜单 - 动态更新选项

6

我正在使用Python 2.7.6的Tkinter创建GUI。

我有一个下拉菜单,使用以下代码创建并最初禁用:

    self.dropdown = Tkinter.OptionMenu(self, self.dropdownVar, "Select SED...")
    self.dropdown.grid(column=0,row=1)
    self.dropdown.configure(state="disabled")

当用户选择一个目录后,我会调用一个名为onEnterDir()的函数来获取该目录下的文件列表。因此,我有了一个名为dirFiles的变量存放这些文件。

我的目标是使用dirFiles列表中的项目更新下拉菜单中的选项。我应该如何做呢?

我的问题与其他问题不同,因为我只想更新self.dropdown显示的项目列表。它不依赖于任何其他小部件。我有一个Python列表,我想把它放进去。我该怎么做?


这不是一个重复的内容! - Carl M
2
我相信你引用了错误的链接。你问题的旧答案在这里:https://dev59.com/d2Qm5IYBdhLWcg3w6CWr#17252390 - mjhm
3个回答

4
您可以在您提到的问题的答案中使用相同的技术:
例如:
import os
from functools import partial
from Tkinter import *
from tkFileDialog import askdirectory

def onEnterDir(dropdown, var):
    path = askdirectory()
    if not path:
        return
    filenames = os.listdir(path)
    dropdown.configure(state='normal')  # 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 name=name: var.set(name))
        # OR menu.add_command(label=name, command=partial(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
为什么在这段代码创建的GUI界面中,只能选择最后一个项目? - rgholizadehr
@R.GholizadehR.,我不明白。 - falsetru
1
@falsetru,实际上,当选择一个目录时,它的内容会显示在选项菜单中,但是选择不起作用。例如,选项菜单中有10个项目;如果您选择第二个项目,则选项菜单会显示第十个项目,并锁定在那里。 - rgholizadehr
@R.GholizadehR.,啊,有一个bug;请替换menu.add_command这一行。我刚刚根据更新的命令进行了更新;在更新之前,lambda中的name引用了最后一个name值(原因)。 - falsetru

0

你可以使用OptionMenu.set_menu(*values),这个方法与@falsetru的回答中的方法类似。


为了使其工作,我不得不编辑ttk.py中的set_menu()函数,因为关键字默认参数位于位置参数列表之前,所以它会消耗列表的第一项。 - undefined

0

首先必须将self.dropdown设置为活动状态,然后像这样输入选项列表:

    self.dropdown.configure(state="active")
    for fi in dirList:
        self.dropdown['menu'].add_command(label=fi, command=Tkinter._setit(self, fi))

命令位是让我感到困惑的地方。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接