1

我正在使用 Tkinter 构建具有一些条件逻辑的表单。有两个选项菜单,第二个中可用的选项取决于用户在第一个中的选择。然而,由于某种原因,一旦用户选择了不同的选项,第一个菜单中的默认选项就会消失。例如,如果用户在下面的 reprex 中选择了类别 B,他们可以更改为 C 或返回 B,但不能更改回 A。

有人可以帮我理解为什么会这样吗?

from tkinter import *
from tkinter import ttk

def update_options(self, *args):
    list = dict[first_category.get()]
    second_category.set(list[0])

    menu = optionmenu_b['menu']
    menu.delete(0, 'end')

    for item in list:
        menu.add_command(label=item, command=lambda selection=item: second_category.set(selection))

window = Tk()

style = ttk.Style(window)
style.theme_use("aqua")

dict = {'A':
['A1', "A2"],
'B':
['B1', 'B2'],
'C':
['C1', 'C2']}

first_category = StringVar()
second_category = StringVar()

optionmenu_a = ttk.OptionMenu(window, first_category, *dict.keys())
optionmenu_b = ttk.OptionMenu(window, second_category, '')
for item in dict['A']:
    optionmenu_b['menu'].add_command(label=item, command=lambda selection=item: second_category.set(selection))

first_category.trace('w', update_options)

optionmenu_a.grid(row = 0, column = 1)
optionmenu_b.grid(row = 1, column = 1)

ttk.Label(window, text = "First Label:").grid(row = 0, column = 0)
ttk.Label(window, text = "Second Label:").grid(row = 1, column = 0)

window.title('Options')
window.geometry("500x500+10+10")
window.mainloop()

4

1 回答 1

2

您没有设置默认选项,因此 tkinter 从字典中取出第一个选项 A,并认为这是用户尚未选择任何内容时应该显示的内容。为避免这种情况,您可以在 ttk.OptionMenu 中设置默认选项,如下所示:

optionmenu = ttk.OptionMenu(root, variable, default_option, *options)

所以你的 OptionMenu 看起来像这样:

optionmenu_a = ttk.OptionMenu(window, first_category, 'A', *dict.keys())

而不是这个:

optionmenu_a = ttk.OptionMenu(window, first_category, *dict.keys())
于 2021-11-22T20:07:38.047 回答