Search code examples
pythoncomboboxpysimplegui

Pysimplegui Combo dynamically refresh


Good day everyone. Is there a way to dynamically add json values in the second Combo when the json element in the first Combo is selected?

import json
import PySimpleGUI as sg


file = {"item 1": [{"name": "title 1"}, {"name": "title 2"}], "item 2": [{"name": "title 3"}, {"name": "title 4"}]}
j_file = json.dumps(file)

layout = [[sg.Text('items'), sg.Combo(j_file, key='some_key', size=(30, 0))],  # there must be items
          [sg.Text('titles'), sg.Combo(j_file, key='other_key', size=(30, 0))]]  # there must be values of selected item
window = sg.Window('testing', layout)
while True:
    event, value = window.read()
    if event == sg.WINDOW_CLOSED:
        break

Solution

  • Here not to use json data j_file dirctly, but dictionary file.

    After first combo selected, an event generated, then update second combo with new list.

    import json
    import PySimpleGUI as sg
    
    
    file = {"item 1": [{"name": "title 1"}, {"name": "title 2"}], "item 2": [{"name": "title 3"}, {"name": "title 4"}]}
    j_file = json.dumps(file)
    
    layout = [[sg.Text('items'), sg.Combo(list(file.keys()), enable_events=True, key='some_key', size=(30, 0))],  # there must be items
              [sg.Text('titles'), sg.Combo([], key='other_key', size=(30, 0))]]  # there must be values of selected item
    window = sg.Window('testing', layout)
    
    while True:
        event, values = window.read()
        if event == sg.WINDOW_CLOSED:
            break
        elif event =='some_key':
            item = values[event]
            title_list = [i["name"] for i in file[item]]
            window['other_key'].update(value=title_list[0], values=title_list)
    
    window.close()