У меня есть окно, содержащее таблицу, заполненную базой данных sqllite. После выбора строки в таблице я хотел бы удалить строку БД, отобразить всплывающее окно подтверждения и обновить таблицу, чтобы отразить ее. Процесс выбора строки, возврата значений, обновления базы данных и отображения всплывающего окна работает... однако я не могу заставить таблицу отражать изменения и получать эту ошибку.
Traceback (most recent call last):
File "/home/ryan/VT_Projects/record_collection_gui/input_tab.py", line 152, in <module>
row_index = values["-RECORDSTABLE-"][0]
IndexError: list index out of range
Удалить функцию и основной цикл:
def delete_record(selected_row: list) -> None:
db.delete_db_item(table = "records_data", key=selected_row[0])
sg.popup(f"Deleted {selected_row[1]} {selected_row[2]}", title = "Delete successful")
def edit_record(selected_row: list, evnt, val) -> None:
pass
window = sg.Window("Vinyl Catalogue", table_layout, modal=True)
while True:
event, values = window.read()
if event == "-RECORDSTABLE-":
row_index = values["-RECORDSTABLE-"][0]
selected_row_values = table_array[row_index]
else:
pass
if event == "-DELETERECORD-":
try:
delete_record(selected_row_values)
window["-RECORDSTABLE-"].update(values=table_array)
except NameError:
sg.popup_error("Please select row to delete", title = "Error")
elif event == "-EXPORTCSV":
export_csv(table_array)
elif event == "-QUIT-":
break
window.close()
Спасибо за вашу помощь!
Решено!
Обработано IndexError
, вызванное отсутствием значения после удаления.
Используется refresh()
для обновления значений в таблице после удаления.
import PySimpleGUI as sg
from database import db_querys as db
def delete_record(table: list, row: list, index: int) -> None:
db.delete_db_item(table = "records_data", key=row[0])
del table[index]
window = sg.Window("Vinyl Catalogue", table_layout)
while True:
event, values = window.read()
if event == "-RECORDSTABLE-":
try:
row_index = values["-RECORDSTABLE-"][0]
selected_row = table_array[row_index]
except IndexError:
continue
if event == "-DELETERECORD-":
try:
delete_record(table_array, selected_row, row_index)
window['-RECORDSTABLE-'].update(table_array)
sg.popup(f"Deleted {selected_row[1]} {selected_row[2]}", title = "Delete successful")
except NameError:
sg.popup_error("Please select row to delete", title = "Error")
elif event == "-EXPORTCSV":
export_csv(table_array)
elif event == "-QUIT-":
break
window.close()
Возможно, это вызвано отсутствием выбора в вашей таблице, поэтому значение для
values["-RECORDSTABLE-"]
равно[]
, поэтому вы получилиIndexError: list index out of range
. Один операторif
для проверки значенияvalues["-RECORDSTABLE-"]
перед вызовомvalues["-RECORDSTABLE-"][0]
.