Относительный список OptionMenu в Tkinter Python

Я работаю над графическим интерфейсом для вставки данных в базу данных. Мне нужно создать раскрывающийся список (поле со списком), который изменит его значения на основе значения, выбранного в другом раскрывающемся списке.

Я пытался использовать статус выбранных значений из первого OptionMenu на основе StringVar, но он не работает. У Вас есть какие-то предложения?

    Type =('Option1', 'Option2', 'Option3')
    CategoryA = ('1','2', '3')
    CategoryB= ('A','Transport')

    TypeSelected = StringVar()
    TypeSelected.set(Type[0])
    TypeOption = OptionMenu(self,TypeSelected,*Type)
    TypeOption.grid(row=1, column=1)

    CategoryLabel = Label(self,text='Category')
    CategoryLabel.grid(row=2, column=0)

    CategorySelected = StringVar()
    print(str(TypeSelected))
    if(str(TypeSelected)=='Przychody'):
        CategorySelected.set(CategoryPrzychody[0])
        category = CategoryPrzychody
    else:
        CategorySelected.set(CategoryRozchody[0])
        category = CategoryRozchody
    CategoryOption = OptionMenu(self,CategorySelected,*category)
    CategoryOption.grid(row=2,column=1)

person Noxiss    schedule 08.10.2018    source источник
comment
Этот фрагмент кода находится в функции, которую вы вызываете, или просто запускается в начале программы перед основным циклом?   -  person strava    schedule 09.10.2018
comment
Возможный дубликат Изменение параметров OptionMenu при нажатии Кнопка   -  person strava    schedule 09.10.2018
comment
это под функцией, но я пробовал оба способа   -  person Noxiss    schedule 10.10.2018


Ответы (1)


Вы правы, но этот код не изменит параметры после вызова mainloop(), поскольку он запускается только один раз в начале программы. Вам нужно отследить StringVar в первом OptionMenu, и всякий раз, когда он изменяется, вызывать функцию для изменения параметров во втором OptionMenu. Для изменения параметров необходимо удалить существующие, а затем добавить новые с помощью add_command(). Например:

import tkinter as tk


def set_options(*args):
    """
    Function to configure options for second drop down
    """
    global option, option2, menu2
    a = ['1', '2', '3']
    b = ['4', '5', '6']

    # check something has been selected
    if option.get() == '(select)':
        return None

    # refresh option menu
    option2.set('(select)')
    menu2['menu'].delete(0, 'end')

    # pick new set of options
    if option.get() == 'A':
        new_options = a
    else:
        new_options = b

    # add new options in
    for item in new_options:
        menu2['menu'].add_command(label=item, command=tk._setit(option2, item))


root = tk.Tk()

# drop down to determine second drop down
option = tk.StringVar(root)
option.set('(select)')

menu1 = tk.OptionMenu(root, option, 'A', 'B')
menu1.pack()

# trace variable and change second drop down
option.trace('w', set_options)

# second drop down
option2 = tk.StringVar(root)
option2.set('(select)')

menu2 = tk.OptionMenu(root, option2, '(select)')
menu2.pack()
# initialise
set_options()

root.mainloop()
person strava    schedule 10.10.2018