Python 3.x Tkinter,curseelection()[0],索引器: ;元组 ;指数 ;out ;of ;范围
我正在使用Tkinter和sqlite3将数据库应用程序的前端连接到后端 需要帮助查找导致此错误的潜在原因: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
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