PySimpleGUI, получаю ошибку KeyError там, где её не может быть

Mu3aHTpoTT

Новичок
Пользователь
Ноя 16, 2021
5
0
1
1. Windows 10
2. Python 3.6
3.
import PySimpleGUI as sg
import numpy as np
import pandas as pd
import datetime
4.
Python:
import PySimpleGUI as sg
import numpy as np
import pandas as pd
import datetime
df = [['              ','                ','                ','                 ','               ','                 ','                    ','                     ']]
df1 = np.array(df).tolist()
headings = ['Name','Date of birth','Phone number','Position','Salary','Retention percentage','Final Salary','Employment date']
sg.theme('darkgrey8')
def make_win1():
    layout = [
        [
         sg.Button('Add employee',size=(20,1),key='-ADD-',button_color='darkgreen'),
         sg.Button('Remove employee',size=(20,1),key='-DELETE-',button_color='darkred'),
         sg.Button('Change employee data',size=(25,1),key='-CHANGE-',button_color='darkorange'),
         sg.Text('                                                                     '),
         sg.Input(key='-FILEBROWSE-'),
         sg.FileBrowse('File browse',button_color='darkorange',file_types=(("csv Files", "*.csv"),)),
         sg.Button('Go', button_color='darkgreen'),       
         ],
        [sg.Table(values=df1,
                    headings=headings,
                    max_col_width=35,             
                    display_row_numbers=True,
                    justification='center',
                    alternating_row_color='grey',
                    key='-TABLE-',
                    size=(150,20),
                    enable_events=True,
                    row_height=30,
                    )],
        [sg.Button('Save',size=(20,1), button_color='darkgreen',key='-SAVE-')]
    ]
    return sg.Window('Employee accounting', layout,finalize=True)
def make_win2():
    l_col = sg.Column(
        [
        [sg.Text('Name'),sg.Input(key='0-IN-1', enable_events=True)],
        [sg.Text('Date of birth'),sg.Input(key='0-IN-2', enable_events=True)],
        [sg.Text('Phone number'),sg.Input(key='0-IN-3', enable_events=True)],
        [sg.Text('Position'),sg.Input(key='0-IN-4', enable_events=True)],
        [sg.Text('Salary'),sg.Input(key='0-IN-5', enable_events=True)],
        [sg.Text('Retention percentage'),sg.Input(key='0-IN-6', enable_events=True)],
        [sg.Button('OK',key='0-ADD-',button_color='darkgreen')]
        ],
        element_justification="right"   
)
    layout = [
        [l_col]
        ]
    return sg.Window('Add employee', layout, finalize=True)
def make_win3():
    l_col = sg.Column(
        [
        [sg.Text('Name'),sg.Input(key='1-IN-1', enable_events=True)],
        [sg.Text('Date of birth'),sg.Input(key='1-IN-2', enable_events=True)],
        [sg.Text('Phone number'),sg.Input(key='1-IN-3', enable_events=True)],
        [sg.Text('Position'),sg.Input(key='1-IN-4', enable_events=True)],
        [sg.Text('Salary'),sg.Input(key='1-IN-5', enable_events=True)],
        [sg.Text('Retention percentage'),sg.Input(key='1-IN-6', enable_events=True)],
        [sg.Button('OK',key='1-ADD-',button_color='darkgreen')]
        ],
        element_justification="right"   
)
    layout = [
        [l_col]
        ]
    return sg.Window('Change employee data', layout, finalize=True)
window1, window2, window3 = make_win1(), None, None 
while True:
    #try:
        window, event, values = sg.read_all_windows()
        if event == sg.WIN_CLOSED or event == 'Exit':
            window.close()
            if window == window2:     
                window2 = None
            elif window == window3:       
                window3 = None
            elif window == window1:   
                break
        elif event == 'Go':
            data = values['-FILEBROWSE-']
            df = pd.read_csv(data,delimiter=',')
            df1 = np.array(df).tolist()
            window1['-TABLE-'].update(df1)
        elif event == '-ADD-':
            window2 = make_win2()
        elif event == '0-ADD-':
            now = datetime.datetime.now()
            fs = int(values['0-IN-5'])-int(values['0-IN-6'])*int(values['0-IN-5'])//100
            new_line={'Name':values['0-IN-1'],
                      'DateOfBirth':values['0-IN-2'],
                      'PhoneNumber':values['0-IN-3'],
                      'Position':values['0-IN-4'],
                      'Salary':values['0-IN-5'],
                      'RetentionPercentage':values['0-IN-6'],
                      'FinalSalary':fs,
                      'EmploymentDate':now.date()}
            df = df.append(new_line, ignore_index=True)
            df1 = np.array(df).tolist()
            window1['-TABLE-'].update(df1)
            window2.close()
        elif event == '-DELETE-':
            row_index = 0
            for num in values['-TABLE-']:
                row_index = num
            all_table_vals = window1['-TABLE-'].get()
            object_name_deletion = all_table_vals[row_index]
            df = df.drop([row_index],axis=0)
            df = df.reset_index(drop=True)
            df1 = np.array(df).tolist()
            window1['-TABLE-'].update(df1)
        elif event == '-CHANGE-':
            window3 = make_win3()
        elif event == '1-ADD-':
            row_index = 0
 !!!           for num in values['-TABLE-']:                !!!
                row_index = num
            all_table_vals = window1['-TABLE-'].get()
            object_name_deletion = all_table_vals[row_index]
            fs = int(values['1-IN-5'])-int(values['1-IN-6'])*int(values['1-IN-5'])//100
            new_line={'Name':values['1-IN-1'],
                      'DateOfBirth':values['1-IN-2'],
                      'PhoneNumber':values['1-IN-3'],
                      'Position':values['1-IN-4'],
                      'Salary':values['1-IN-5'],
                      'RetentionPercentage':values['1-IN-6'],
                      'FinalSalary':fs}
            df1 = df.iloc[row_index]
            df = df.replace(df1, new_line)
            df1 = np.array(df).tolist()
            window1['-TABLE-'].update(df1)
            window3.close()
        elif event == '-SAVE-':
            df.to_csv(data,sep=',',header=True,index=None)
   #except Exception:
        #print('Error')
window.close()
Ошибка в кусочке функции кнопки '1-ADD-' (её суть в том, чтобы изменить данные строки DataFrame, выбранной кликом мыши), при том, что этот кусочек скопирован-вставлен из РАБОТАЮЩЕЙ кнопки '-DELETE-' (удаление строки DataFrame, выбранной кликом мыши)123.png. Куда бы я не переставлял в бесконечном цикле этот кусочек, жалуется на одну и ту же строку, отмеченную в коде выше восклицательными знаками:
File "C:\Users\Mu3aHTpoTT\Desktop\main.py", line 116, in <module>
for num in values['-TABLE-']:
KeyError: '-TABLE-'
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 589
459
83
в вашем коде это далеко не единственная проблема...
я добавить не могу, чтобы воспроизвести вашу проблему...
 

Mu3aHTpoTT

Новичок
Пользователь
Ноя 16, 2021
5
0
1
в вашем коде это далеко не единственная проблема...
я добавить не могу, чтобы воспроизвести вашу проблему...
Прошу прощения, пока что я пробую только через подключение csv файла, держите, попробуйте пожалуйста с помощью кнопки "File browse", выбора csv файла и последующего нажатия "Go" в моей программе
 

Вложения

  • csv файл.zip
    346 байт · Просмотры: 2

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 589
459
83
проблема в том в values при удалении у вас значение такое: {'-FILEBROWSE-': 'D:/kontrolnie_raboti/test_python_server/filename.csv', 'File browse': 'D:/kontrolnie_raboti/test_python_server/filename.csv', '-TABLE-': [0]}, где '-TABLE-': [0] - это индекс позиции
а при изменении в values лежит какой то мусор: {'1-IN-1': '', '1-IN-2': '', '1-IN-3': '', '1-IN-4': '', '1-IN-5': '', '1-IN-6': ''}, и тут нет ключа -TABLE-...

где то вы изменяете values в процессе цикла...

PS
пользуйтесь дебагером, или просто принты пишите в непонятных ситуациях, чтобы посмотреть, что происходит...
 
  • Мне нравится
Реакции: Mu3aHTpoTT

Mu3aHTpoTT

Новичок
Пользователь
Ноя 16, 2021
5
0
1
проблема в том в values при удалении у вас значение такое: {'-FILEBROWSE-': 'D:/kontrolnie_raboti/test_python_server/filename.csv', 'File browse': 'D:/kontrolnie_raboti/test_python_server/filename.csv', '-TABLE-': [0]}, где '-TABLE-': [0] - это индекс позиции
а при изменении в values лежит какой то мусор: {'1-IN-1': '', '1-IN-2': '', '1-IN-3': '', '1-IN-4': '', '1-IN-5': '', '1-IN-6': ''}, и тут нет ключа -TABLE-...

где то вы изменяете values в процессе цикла...

PS
пользуйтесь дебагером, или просто принты пишите в непонятных ситуациях, чтобы посмотреть, что происходит...
Большое спасибо
 

Форум IT Специалистов