import PySimpleGUI as sg

"""
    Demo - Listbox Using Objects

    Several elements can take not just strings, but objects.  The Listsbox is one of them.
    This demo show how you can use objects directly in a Listbox in a way that you can access
        information about each object that is different than what is shown in the Window.

    The important part of this design pattern is the use of the __str__ method in your item objects.
        This method is what determines what is shown in the window.

    Copyright 2022 PySimpleGUI
"""

class Item():
    def __init__(self, internal, shown):
        self.internal = internal
        self.shown = shown

    def __str__(self):
        return self.shown

# make list of some objects
my_item_list = [Item(f'Internal {i}', f'shown {i}') for i in range(100)]

layout = [  [sg.Text('Select 1 or more items and click "Go"')],
            [sg.Listbox(my_item_list, key='-LB-', s=(20,20), select_mode=sg.LISTBOX_SELECT_MODE_EXTENDED)],
            [sg.Output(s=(40,10))],
            [sg.Button('Go'), sg.Button('Exit')]  ]

window = sg.Window('Listbox Using Objects', layout)

while True:
    event, values = window.read()
    # print(event, values)
    if event == sg.WIN_CLOSED or event == 'Exit':
        break
    elif event == 'Go':
        print('You selected:')
        for item in values['-LB-']:
            print(item.internal)
window.close()