Python 3.x Tkinter,curseelection()[0],索引器: ;元组 ;指数 ;out ;of ;范围

Python 3.x Tkinter,curseelection()[0],索引器: ;元组 ;指数 ;out ;of ;范围,python-3.x,tkinter,sqlite,Python 3.x,Tkinter,Sqlite,我正在使用Tkinter和sqlite3将数据库应用程序的前端连接到后端 需要帮助查找导致此错误的潜在原因: Exception in Tkinter callback Traceback (most recent call last):   File "C:\Users\Peng\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py", line 1699, in __call__     return self.func

我正在使用Tkinter和sqlite3将数据库应用程序的前端连接到后端

需要帮助查找导致此错误的潜在原因:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\Peng\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py", line 1699, in __call__
    return self.func(*args)
  File "frontend.py", line 9, in get_selected_row
    index=list1.curselection()[0]
IndexError: tuple index out of range
但是
list1.curselection()[0]
只是
id
,为什么超出范围

如果您能帮我找到哪里出了问题,我们将不胜感激

我的代码:

frontend.py:

from tkinter import *
import backend
window=Tk()

list1.bind('<<ListboxSelect>>',get_selected_row)

def update_command():
    backend.update(selected_tuple[0],title_text.get(),author_text.get(),year_text.get(),isbn_text.get())

def get_selected_row(event):
    global selected_tuple
    index=list1.curselection()[0]
    selected_tuple=list1.get(index)
    e1.delete(0,END)
    e1.insert(END,selected_tuple[1])
    e2.delete(0,END)
    e2.insert(END,selected_tuple[2])
    e3.delete(0,END)
    e3.insert(END,selected_tuple[3])
    e4.delete(0,END)
    e4.insert(END,selected_tuple[4])

当没有选择任何内容时,将触发您的方法。最简单的修复方法是简单地检查元组是否为空:

def get_selected_row(event):
    global selected_tuple
    index=list1.curselection()
    if index: # if the tuple is not empty
        selected_tuple=list1.get(index[0])
        e1.delete(0,END)
        e1.insert(END,selected_tuple[1])
        e2.delete(0,END)
        e2.insert(END,selected_tuple[2])
        e3.delete(0,END)
        e3.insert(END,selected_tuple[3])
        e4.delete(0,END)
        e4.insert(END,selected_tuple[4])

一个更合适的解决方法是找出它什么时候被触发并防止它

当列表为空时单击列表1时会发生这种情况 这是触发它的线

list1.bind('<<ListboxSelect>>',get_selected_row)

由于listbox是空的,因此list1.curselection()将是一个没有项目的空列表。尝试在第3行中使用[0]访问该列表的第一项将引发错误,因为列表中没有第一项

def get_selected_row(event):
    try:
        global selected_tuple
        index=list1.curselection()
        selected_tuple=list1.get(index[0])
        e1.delete(0,END)
        e1.insert(END,selected_tuple[1])
        e2.delete(0,END)
        e2.insert(END,selected_tuple[2])
        e3.delete(0,END)
        e3.insert(END,selected_tuple[3])
        e4.delete(0,END)
        e4.insert(END,selected_tuple[4])
    except IndexError:
        pass

当调用get_selected_row函数时,Python将尝试在try下执行indentedblock。如果存在索引器,则不会执行try下的任何行。相反,将执行except下的行,该行为pass。PASS STETEMENT的意思是什么都不做。因此,当列表框为空时,函数将不执行任何操作。

这意味着您在未选择任何内容时调用了
curselection
。您对此做了哪些调试?您是否验证了
list1.curseelection()
是否返回了您假设返回的内容?对,问题似乎是在未选择任何内容时调用了它。但是,当我尝试创建exe文件时,会弹出相同的错误消息。那么,我能做些什么来避免这种情况呢?谢谢大家,真的很感激。为什么不在尝试使用选择之前检查一下是否选择了任何东西呢?对!非常感谢你。哈哈,我对这个很陌生。。。
def get_selected_row(event):
    global selected_tuple
    if list1.curselection():
        index=list1.curselection()[0]
        selected_tuple=list1.get(index)
        e1.delete(0,END)
        e1.insert(END,selected_tuple[1])
        e2.delete(0,END)
        e2.insert(END,selected_tuple[2])
        e3.delete(0,END)
        e3.insert(END,selected_tuple[3])
        e4.delete(0,END)
        e4.insert(END,selected_tuple[4])
def get_selected_row(event):
    try:
        global selected_tuple
        index=list1.curselection()
        selected_tuple=list1.get(index[0])
        e1.delete(0,END)
        e1.insert(END,selected_tuple[1])
        e2.delete(0,END)
        e2.insert(END,selected_tuple[2])
        e3.delete(0,END)
        e3.insert(END,selected_tuple[3])
        e4.delete(0,END)
        e4.insert(END,selected_tuple[4])
    except IndexError:
        pass