ошибка IndexError: tuple index out of range tkinter

Рейтинг: -1Ответов: 1Опубликовано: 30.03.2023

Функция edit_item должен через кнопку edit давать пользователю изменять элементы в listbox, но выходить ошибка:

index = selection[0] 
IndexError: tuple index out of range

вот код

import tkinter as tk
import sqlite3


def edit_item():
    selection = listbox.curselection()  # получаем индекс выбранного элемента
    
    index = selection[0]
    value = listbox.get(index)  # получаем значение выбранного элемента
    entry1.delete(0, END)  # очищаем entry_1
    entry2.delete(0, END)  # очищаем entry_2
    entry3.delete(0, END)
    entry4.delete(0, END)
    entry1.insert(0, value)  # устанавливаем значение entry_1
    entry2.insert(0, value)  # устанавливаем 
    entry3.insert(0, value)
    entry4.insert(0, value)

    
def add_item():
    # Создать список из значений entry, entry1, entry2 и entry3
    item_values = [entry1.get(), entry2.get(), entry3.get(), entry4.get()]
    
    # Вставить список значений в Listbox
    listbox.insert(tk.END, item_values)
    
    # Очистить значения Entry виджетов
    entry1.delete(0, tk.END)
    entry2.delete(0, tk.END)
    entry3.delete(0, tk.END)
    entry4.delete(0, tk.END)

def open_add_item_window():
    # Создать новое окно
    window = tk.Toplevel()
    
    # Создать Entry виджеты
    global entry1, entry2, entry3, entry4
    entry1 = tk.Entry(window)
    entry2 = tk.Entry(window)
    entry3 = tk.Entry(window)
    entry4 = tk.Entry(window)
    
    # Создать кнопку для добавления элемента
    add_button = tk.Button(window, text="Добавить", command=add_item)
    

    lb1 = tk.Label(window,text="family")
    lb2 = tk.Label(window,text="name")
    lb3 = tk.Label(window,text="father")
    lb4 = tk.Label(window,text="pass")


    # Разместить Entry виджеты и кнопку на окне
    lb1.pack()
    entry1.pack()
    lb2.pack()
    entry2.pack()
    lb3.pack()
    entry3.pack()
    lb4.pack()
    entry4.pack()
    add_button.pack()


def del_list():
    select = list(listbox.curselection())
    select.reverse()
    for i in select:
        listbox.delete(i)

# Создаем соединение с базой данных
conn = sqlite3.connect('agents.db')

# Создаем объект курсора для выполнения запросов
cursor = conn.cursor()

# Выполняем запрос на выборку данных из таблицы agents
cursor.execute("SELECT * FROM agents")
data = cursor.fetchall()
ListData=list(data)

# Создаем окно Tkinter
root = tk.Tk()

Frame_list = tk.Frame(root,width=500,height=500,bg="green")
Frame_entry = tk.Frame(root,width=500,height=500,bg="red")
Frame_supp = tk.Frame(root,width=500,height=500,bg="blue")

Frame_list.grid(row=0,column=0,sticky="wsne")
Frame_entry.grid(row=0,column=1,sticky="wsne")
Frame_supp.grid(row=0,column=2,sticky="wsne")

# Создаем объекты Listbox и Entry и добавляем данные из базы данных
listbox = tk.Listbox(Frame_list, width=40, height=25)
listbox.grid(row=0, column=0, columnspan=2)

# Создаем 4 объекта Entry для отображения каждого элемента в базе данных
lb=tk.Label(Frame_entry,text="family")
lb.grid(row=0,column=0)
entry1 = tk.Entry(Frame_entry, width=20)
entry1.grid(row=1, column=0, padx=10, pady=10)

lb1=tk.Label(Frame_entry,text="name")
lb1.grid(row=2,column=0)
entry2 = tk.Entry(Frame_entry, width=20)
entry2.grid(row=3, column=0, padx=10, pady=10)

lb2=tk.Label(Frame_entry,text="father")
lb2.grid(row=4,column=0)
entry3 = tk.Entry(Frame_entry, width=20)
entry3.grid(row=5, column=0, padx=10, pady=10)

lb3=tk.Label(Frame_entry,text="pass")
lb3.grid(row=0,column=1)
entry4 = tk.Entry(Frame_entry, width=20)
entry4.grid(row=1, column=1, padx=10, pady=10)

# Функция обработки выбора элемента в Listbox
def on_select(event):
    # Check if an item has been selected
    if listbox.curselection():
         # Get the index of the selected item
        index = listbox.curselection()[0]
        # Get the data for the selected item
        item = data[index]
    # Update the Entry widgets with the selected data
        entry1.delete(0, tk.END)
        entry1.insert(0, item[1])
        entry2.delete(0, tk.END)
        entry2.insert(0, item[2])
        entry3.delete(0, tk.END)
        entry3.insert(0, item[3])
        entry4.delete(0, tk.END)
        entry4.insert(0, item[4])


add = tk.Button(Frame_list,text="add",command=open_add_item_window,width=15)
add.grid(row=1,column=0 )

del1 = tk.Button(Frame_list,text="delete",command=del_list,width=15)
del1.grid(row=1,column=1 )

edit = tk.Button(Frame_entry,text="edit",command=edit_item,width=15)
edit.grid(row=6,column=0 )



# Привязываем функцию on_select к событию выбора элемента в Listbox
listbox.bind('<<ListboxSelect>>', on_select)

# Заполняем Listbox данными из базы данных
for row in data:
    listbox.insert(tk.END, row[1:4])

# Запускаем главный цикл окна
root.mainloop()

# Закрываем соединение с базой данных
conn.close()

Ответы

▲ 0

Ошибка в строке index = selection[0] возникает, если нажать на кнопку редактирования, когда в списке ничего не выбрано, в этом случае в selection пустой кортеж, и обращение к его нулевому элементу вызывает ошибку.

Нужно добавить проверку, что ничего не выбрано, и, например, просто ничего не делать в этом случае:

def edit_item():
    selection = listbox.curselection()  # получаем индекс выбранного элемента
    if not selection:
        return
    index = selection[0]

Но это далеко не единственная проблема в вашем коде.