简体   繁体   中英

Relative OptionMenu list in Tkinter Python

I working on GUI for insering data to a database.I need to create a dropdown list(combobox) that will change it's values based on a value chosen in another dropdown list.

I've tried to use if statment of chosen values from first OptionMenu to based of StringVar but its not working. Do you have any suggestions?

    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)

You're on the right lines, but this code won't change the options after mainloop() has been called as it only runs once at the start of the program. You need to trace the StringVar in the first OptionMenu , and whenever it's changed call a function to change the options in the second OptionMenu . To change the options you need to delete the existing ones, and then add new ones using add_command() . For example:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM