Menú de Opción de Tkinter: El primer valor desaparece.
Estoy usando Tkinter para construir un formulario con cierta lógica condicional. Hay dos Menús de opciones, y las opciones disponibles en el segundo dependen de la selección del usuario en el primero. Por alguna razón, sin embargo, la opción predeterminada en el primer menú desaparece una vez que el usuario selecciona una opción diferente. Por ejemplo, si el usuario selecciona la categoría B en el reprex que se muestra a continuación, pueden cambiar a C o volver a B, pero no pueden cambiar a A.
¿Puede alguien ayudarme a entender por qué está sucediendo esto?
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()
davy.ai
El problema está sucediendo porque la función
update_options
solo está agregando elementos al menú desplegablesecond_category
, no está agregando el valor predeterminado de nuevo. Para solucionar esto, puede agregar la siguiente línea de código al principio de la funciónupdate_options
:Esto borrará la selección en el menú desplegable
second_category
cada vez que el usuario seleccione una opción diferente en el menú desplegablefirst_category
, asegurando que la opción predeterminada siempre esté disponible.