@i_go_hard

Как обновить таблицу первого окна кнопкой из второго окна, используя библиотеку PySimpleGUI в Python?

Здравствуйте. Пытаясь оседлать библиотеку PySimpleGUI, столкнулся с такой проблемой: хочу добавить новую строку в массив и затем обновить таблицу по нажатию кнопки, куда выводится весь тот самый массив, но не могу разобраться в ключах и функции Update для обновления таблицы. Исходный код:
import PySimpleGUI as sg
import numpy as np
import pandas as pd
df = pd.read_csv("filename.csv",delimiter=',')
tab = np.array(df).tolist()
headings = ['Name','DOB','PhoneNumber','Position']
sg.theme('Dark Green')
def make_win1():
    layout = [
        [sg.FileBrowse('Выбрать базу данных'),
         sg.Button('Добавить сотрудника',size=(20,1)),
         sg.Button('Удалить сотрудника',size=(20,1)),
         sg.Button('Изменить данные сотрудника',size=(25,1))],
        [sg.Table(values=tab,
                    headings=headings,
                    max_col_width=35,
                    auto_size_columns=True,
                    display_row_numbers=True,
                    justification='center',
                    alternating_row_color='lightyellow',
                    key='-TABLE-',
                    size=(100,20),
                    enable_events=True,
                    row_height=30)],
    ]
    return sg.Window('Window Title', layout,finalize=True,grab_anywhere=True)
def make_win2():
    l_col = sg.Column(
        [
        [sg.Text('Фио'),sg.Input(key='-IN-1', enable_events=True)],
        [sg.Text('Дата рождения'),sg.Input(key='-IN-2', enable_events=True)],
        [sg.Text('Номер телефона'),sg.Input(key='-IN-3', enable_events=True)],
        [sg.Text('Должность'),sg.Input(key='-IN-4', enable_events=True)],
        [sg.Button('Добавить')]
        ],
        element_justification="right"    
)
    layout = [
        [l_col]
        ]
    return sg.Window('Second Window', layout, finalize=True)
window1, window2 = make_win1(), None        # start off with 1 window open
while True:             # Event Loop
    window, event, values = sg.read_all_windows() # Read the event that happened and the values dictionary
    if event == sg.WIN_CLOSED or event == 'Exit': # If user closed window with X or if user clicked "Exit" button then exit
        window.close()
        if window == window2:       # if closing win 2, mark as closed
            window2 = None
        elif window == window1:     # if closing win 1, exit program
            break
    elif event == 'Добавить сотрудника' and not window2:
        window2 = make_win2()
    elif event == 'Добавить':
        new_line={'Name':"-IN-1",'DOB':'-IN-2','PN':'-IN-3','Pos':'-IN-4'}
        df=df.append(new_line,ignore_index=True)
        window1['-TABLE-'].Update(values['-IN-1','-IN-2','-IN-3','-IN-4'])
        #print(df)
window.close()
  • Вопрос задан
  • 391 просмотр
Пригласить эксперта
Ответы на вопрос 2
HemulGM
@HemulGM Куратор тега Python
Delphi Developer, сис. админ
Это не проблема, а не желание изучить библиотеку. Почему бы вам не пойти на фриланс и отдать решить задачу кому-то кто знает?

P.S. в программировании такое часто бывает: приходится изучать какую-то библиотеку прежде чем что-то на ней писать. Не справедливо, согласен.
Ответ написан
@semen-pro
Хороший вопрос. В официальной документации эта тема не раскрыта.
Гугл выдает этот вопрос, значит, надо самому разбираться)

Вариант с использованием атрибутов функций:
import PySimpleGUI as sg


def create_second_window():
    slider = sg.Slider(range=(100, 1200), default_value=500, expand_x=True, enable_events=True, orientation='horizontal', key='-slider-')
    
    buttons = (sg.Button('OK'),)
    
    layout=[[slider], [buttons]]
    
    return sg.Window('Generate blocks', layout, finalize=True, keep_on_top=True)


def second_win_dialog():
    try:
        event, values = second_win_dialog.window.read(timeout=10)
        if event == sg.WINDOW_CLOSED:
            second_win_dialog.window.close()
            second_win_dialog.__dict__.pop("window")
            
        elif values["-slider-"]:
            window['-value-'].update(value=values["-slider-"])

    except AttributeError:
        pass

    
layout = [
   [sg.Button('dialog')],
   [sg.Input(key='-value-',  s=8)],
]

window = sg.Window('Hello', layout, size=(400, 150))

while True:
    second_win_dialog()
    event, values = window.read(timeout=10)
   
    if event == sg.WIN_CLOSED or event == 'Exit':
       break
  
    elif event == 'dialog':
        try:
            window_is_exist = second_win_dialog.window 
        except AttributeError:
            second_win_dialog.window = create_second_window()

window.close()


PS: 2 года прошло, расскажите, как решили проблему
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы