当curselection绑定到ListBox后,在单击其他窗口小部件后返回空元组时出现错误

时间:2017-07-11 19:28:47

标签: python-3.x tkinter listbox

我有一个关于ListBox的curselection的问题。它出现在Python 3.6中。在Python 3.4中一切正常。我的代码从ListBox中选择项目并将其放在Entry小部件中。当我点击ListBox中的项目时,它的效果非常好。但有时(在5-10次点击后)当我点击Entry小部件时会出现错误:

  

_tkinter.TclError:错误的列表框索引"":必须处于活动状态,锚点,结束,@ x,y或数字

这是我的代码示例:

   from tkinter import *

def insert_into_entry(event):
    index=list_box.curselection()
    print(index)
    selected_item=list_box.get(index)
    entry1.delete(0,END)
    entry1.insert(END,selected_item)

window=Tk()
entry=Entry(window)
entry.grid(row=0,column=0)

list_box=Listbox(window,height=5,width=45)
list_box.grid(row=1,column=0)
list_box.bind('<<ListboxSelect>>',insert_into_entry)

entry1=Entry(window)
entry1.grid(row=2,column=0)

a=['one','two','three','four']
for i in a:
    list_box.insert(END,i)

window.mainloop()

我试图检查索引值的变化。并且在单击Entry小部件索引后返回空元组时会出现错误。这是我的第一个问题,所以我会对每一个回复都很满意。

1 个答案:

答案 0 :(得分:0)

通过测试我可以看到<<ListboxSelect>>我相信<<ListboxSelect>>事件会在每次选择更改时激活,即使该选择更改为&#34;没有选择&#34;。我相信这就是为什么当您点击列表框并进入任何其他字段并触发<<ListboxSelect>>事件时,insert_into_entry函数会从curselection()获取一个空元组。 根据文档here,如果没有选择任何内容,courselection()方法将返回一个空元组。

为避免任何错误,我们可以先检查ndex = list_box.curselection()的结果是否等于()空元组。如果没有,则执行该功能的其余部分。这应该可以防止在列表框之外调用<<ListboxSelect>>事件导致此行为导致的任何错误。

哦,另外一件事。不要使用内置名称来表示变量名称。将index = list_box.curselection()更改为ndex = list_box.curselection()

from tkinter import *

window=Tk()

def insert_into_entry(Event = None):
    ndex = list_box.curselection()
    if ndex != ():
        selected_item=list_box.get(ndex)
        entry1.delete(0,END)
        entry1.insert(END,selected_item)


entry=Entry(window)
entry.grid(row=0,column=0)

list_box=Listbox(window,height=5,width=45)
list_box.grid(row=1,column=0)
list_box.bind('<<ListboxSelect>>', insert_into_entry)

entry1=Entry(window)
entry1.grid(row=2,column=0)

a=['one','two','three','four']
for i in a:
    list_box.insert(END,i)

window.mainloop()