元组索引超出与curselection(tkinter)相关的范围错误

时间:2016-07-08 04:03:37

标签: python tkinter listbox

我有这个清单:

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

如何防止这种情况发生?

2 个答案:

答案 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()]

TkInter Listbox docs

答案 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 *