[SOLVED] Is there a way to clear a tree element in PySimpleGUI before adding new data?

Issue

This Content is from Stack Overflow. Question asked by Eduardo C.

I have a window with a tree element that shows files and folders when I enter a path. I need this tree to clear if I enter a new path. At the moment the tree appends the files/folders from each path I enter. Is there a way to refresh the tree element before entering new information into it?

My code is similar to this:

import PySimpleGUI as sg
import os


starting_path = os.getcwd()

treedata = sg.TreeData()

folder_icon = b'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAABnUlEQVQ4y8WSv2rUQRSFv7vZgJFFsQg2EkWb4AvEJ8hqKVilSmFn3iNvIAp21oIW9haihBRKiqwElMVsIJjNrprsOr/5dyzml3UhEQIWHhjmcpn7zblw4B9lJ8Xag9mlmQb3AJzX3tOX8Tngzg349q7t5xcfzpKGhOFHnjx+9qLTzW8wsmFTL2Gzk7Y2O/k9kCbtwUZbV+Zvo8Md3PALrjoiqsKSR9ljpAJpwOsNtlfXfRvoNU8Arr/NsVo0ry5z4dZN5hoGqEzYDChBOoKwS/vSq0XW3y5NAI/uN1cvLqzQur4MCpBGEEd1PQDfQ74HYR+LfeQOAOYAmgAmbly+dgfid5CHPIKqC74L8RDyGPIYy7+QQjFWa7ICsQ8SpB/IfcJSDVMAJUwJkYDMNOEPIBxA/gnuMyYPijXAI3lMse7FGnIKsIuqrxgRSeXOoYZUCI8pIKW/OHA7kD2YYcpAKgM5ABXk4qSsdJaDOMCsgTIYAlL5TQFTyUIZDmev0N/bnwqnylEBQS45UKnHx/lUlFvA3fo+jwR8ALb47/oNma38cuqiJ9AAAAAASUVORK5CYII='
file_icon = b'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAABU0lEQVQ4y52TzStEURiHn/ecc6XG54JSdlMkNhYWsiILS0lsJaUsLW2Mv8CfIDtr2VtbY4GUEvmIZnKbZsY977Uwt2HcyW1+dTZvt6fn9557BGB+aaNQKBR2ifkbgWR+cX13ubO1svz++niVTA1ArDHDg91UahHFsMxbKWycYsjze4muTsP64vT43v7hSf/A0FgdjQPQWAmco68nB+T+SFSqNUQgcIbN1bn8Z3RwvL22MAvcu8TACFgrpMVZ4aUYcn77BMDkxGgemAGOHIBXxRjBWZMKoCPA2h6qEUSRR2MF6GxUUMUaIUgBCNTnAcm3H2G5YQfgvccYIXAtDH7FoKq/AaqKlbrBj2trFVXfBPAea4SOIIsBeN9kkCwxsNkAqRWy7+B7Z00G3xVc2wZeMSI4S7sVYkSk5Z/4PyBWROqvox3A28PN2cjUwinQC9QyckKALxj4kv2auK0xAAAAAElFTkSuQmCC'

def add_files_in_folder(parent, dirname):
    files = os.listdir(dirname)
    for f in files:
        fullname = os.path.join(dirname, f)
        if os.path.isdir(fullname):  # if it's a folder, add folder and recurse
            treedata.Insert(parent, fullname, f, values=[], icon=folder_icon)
            add_files_in_folder(fullname, fullname)
        else:
            treedata.Insert(parent, fullname, f, values=[os.stat(fullname).st_size], icon=file_icon)

def main_window():

    column_one = sg.Column([
        [sg.Tree(data=treedata,
                 headings=['Size', ],
                 auto_size_columns=True,
                 select_mode=sg.TABLE_SELECT_MODE_EXTENDED,
                 num_rows=20,
                 col0_width=40,
                 key='-TREE-',
                 show_expanded=False,
                 enable_events=True,
                 expand_x=True,
                 expand_y=True,
                 ), ],
        [sg.B('Open', k='-OPEN-'), sg.B('Add', k='-ADD-')],
    ])

    layout = [
        [sg.T('Some text')],
        [sg.HorizontalSeparator()],
        [sg.T('Select the files / folders')],
        [column_one],
        [sg.B('Cancel', k='-EXIT-')]
    ]
    return sg.Window('some window', layout, resizable=True, finalize=True)


window = main_window()
while True:
    event, values = window.read()
    if event in (sg.WIN_CLOSED, '-EXIT-'):
        break
    print(event, values)

    if event == '-OPEN-':
        starting_path = sg.popup_get_folder('Folder to display')
        add_files_in_folder('', starting_path)
        window['-TREE-'].update(values=treedata)

window.close()

Any help is appreciated!



Solution

Following code demo how to create/clear/append data to treedata for Table element. Here all item added as children of root ''.

import PySimpleGUI as sg

def add_data(treedata, offset):
    default = [[str((i+1)*(j+offset+1)) for i in range(9)] for j in range(9)]
    for i, value in enumerate(default):
        treedata.insert('', i+offset+1, i+offset+1, value)
    return treedata

treedata = sg.TreeData()
treedata = add_data(treedata, 0)
index = 10
layout = [
    [sg.Tree(
        data=treedata,
        headings=[str(i+1) for i in range(9)],
        col0_heading='9x9',
        col0_width=5,
        num_rows=20,
        key='-TREE-',
     )],
    [sg.Button('Clear'), sg.Button('Reset'), sg.Button('Append')],
]
window = sg.Window('Title', layout, finalize=True)
tree = window['-TREE-']
tree.Widget.column('#0', anchor='e')

while True:

    event, values = window.read()

    if event == sg.WIN_CLOSED:
        break
    elif event == 'Clear':
        treedata = sg.TreeData()
        tree.update(values=treedata)
        index = 0
    elif event == 'Reset':
        treedata = add_data(sg.TreeData(), 0)
        tree.update(values=treedata)
        index = 10
    elif event == 'Append':
        treedata = add_data(treedata, index)
        tree.update(values=treedata)
        index += 10

window.close()


This Question was asked in StackOverflow by Eduardo C. and Answered by Jason Yang It is licensed under the terms of CC BY-SA 2.5. - CC BY-SA 3.0. - CC BY-SA 4.0.

people found this article helpful. What about you?