TKinter ComboBox Variable Issue

Question:

I am trying to use tkinter, more specifically customtkinter, to create a combobox and have a variable in the first combobox determine what another combobox’s options are. I think the syntax maybe a little different since it is customtkinter rather than standard. Seeing if anyone can take a look at my code.

Here is s snipit of the class:

# ---------------- HP Pool Option --------------#
        #HP pool values
        #Low
        hp_low_options = ["Random",
                        "5","10","15","20",
                        "25","30","35","40",
                        "45","50","55","60",
                        "65","70","75","80",
                        "85","90","95","100",
                        ]
        #Medium                
        hp_medium_options = ["Random",
                        "105","110","115","120",
                        "125","130","135","140",
                        "145","150","155","160",
                        "165","170","175","180",
                        "185","190","195","200",
                        ]
        #Large
        hp_high_options = ["Random",
                        "205","210","215","220",
                        "225","230","235","240",
                        "245","250","255","260",
                        "265","270","275","280",
                        "285","290","295","300",
                        ]
        #Extreme
        hp_extreme_options = ["Random",
                        "325","350","375","400",
                        "425","450","475","500",
                        "525","550","575","600",
                        "625","650","675","700",
                        "725","750","775","800",
                        ]

        #Create first combobox for pool type
        hp_pool_label = customtkinter.CTkLabel(master=self.frame_left, text="HP Option")
        hp_pool_label.grid(row=5,column=0)
        current_hp_pool = StringVar() #initialize variable
        hp_pool_combobox = customtkinter.CTkComboBox(master=self.frame_left, 
                                                    variable=current_hp_pool, #set variable in combobox
                                                    values=("Random",
                                                            "Low HP Pool", 
                                                            "Medium HP Pool", 
                                                            "High HP Pool", 
                                                            "Extreme HP Pool"))
        hp_pool_combobox.grid(row=5, column=1)

            #This is where the problems start I think 

            hp_pool_combobox.set("Random")  
            hp_pool_combobox.setvar("Test", current_hp_pool)
            current_hp_pool = hp_pool_combobox.current_value

            if current_hp_pool == "Random":
                hp_pool_selected = (hp_low_options,
                                    hp_medium_options,
                                    hp_high_options,
                                    hp_extreme_options)
            elif current_hp_pool == "Low HP Pool":
                hp_pool_selected = hp_low_options
            elif current_hp_pool == "Medium HP Pool":
                hp_pool_selected = hp_medium_options
            elif current_hp_pool == "High HP Pool":
                hp_pool_selected = hp_high_options
            elif current_hp_pool == "Extreme HP Pool":
                hp_pool_selected = hp_extreme_options
            
            hp_value_combobox = customtkinter.CTkComboBox(master=self.frame_left, values=hp_pool_selected)
            hp_value_combobox.grid(row=5, column=2)
            hp_value_combobox.set("Random")

I think creating an even of some sort is the answer so when the new option is selected the event triggers and changes the second combobox options. Thank you for your time and effort!

Asked By: Jared McCallister

||

Answers:

One of the way is to set command option of CTkCombobox and update the second combobox based on the selected value of first combobox inside the callback.

Below is an example:

import customtkinter as ctk

options = {
    'Low': ('5', '10'),
    'Medium': ('15', '20'),
    'High': ('25', '30'),
    'Extreme': ('35', '40')
}

def on_combo1_selected(value):
    values = ('Random',)
    if value == 'Random':
        for v in options.values():
            values += v
    else:
        values += options[value]
    combo2.configure(values=values)
    combo2.set('')

root = ctk.CTk()

var1 = ctk.StringVar()
combo1 = ctk.CTkComboBox(root, variable=var1, values=('Random',)+tuple(options.keys()), command=on_combo1_selected)
combo1.pack()

var2 = ctk.StringVar()
combo2 = ctk.CTkComboBox(root, variable=var2)
combo2.pack()

root.mainloop()

You can apply the logic to your code.

Answered By: acw1668