我有这个清单:
lista=Listbox(root,selectmode=MULTIPLE)
lista.grid(column=0,row=1)
lista.config(width=40, height=4)
lista.bind('<<ListboxSelect>>',selecionado)
附加到此功能:
def selecionado(evt):
global ativo
a=evt.widget
seleção=int(a.curselection()[0])
sel_text=a.get(seleção)
ativo=[a.get(int(i)) for i in a.curselection()]
但如果我选择了某些内容然后取消选择,我会收到此错误:
seleção=int(a.curselection()[0])
IndexError: tuple index out of rangeenter code here
如何防止这种情况发生?
答案 0 :(得分:5)
取消选择项目时,函数curselection()返回一个空元组。当您尝试访问空元组上的元素[0]时,您会得到索引超出范围错误。解决方案是测试这种情况。
def selecionado(evt):
global ativo
a=evt.widget
b=a.curselection()
if len(b) > 0:
seleção=int(a.curselection()[0])
sel_text=a.get(seleção)
ativo=[a.get(int(i)) for i in a.curselection()]
答案 1 :(得分:2)
@PaulComelius答案是正确的,我给出了解决方案的变体以及有用的注释:
首先要注意的是,只有 Tkinter 1.160 和早期版本会导致curselection()返回的列表成为字符串列表而不是整数。这意味着在将整数值转换为seleção=
int( a.curselection()[0]
)中的整数值时,您正在运行无用说明>和ativo=[a.get(
int(我) ) for i in a.curselection()]
其次,我宁愿跑:
def selecionado(evt):
# ....
a=evt.widget
if(a.curselection()):
seleção = a.curselection()[0]
# ...
为什么呢?因为这是Pythonic的方式。
第三和最后:最好运行import tkinter as tk
而不是from tkinter import *
。