我有两个列表框。单击第一个列表框中的项目将在第二个列表框中插入信息。
当我点击其中一个插入的项目时,出现错误。
列表框定义为:
list_1 = Listbox(root,selectmode=SINGLE)
list_2 = Listbox(root,selectmode=SINGLE)
获取所选项目:
list_1.bind('<<ListboxSelect>>',CurSelect)
指的是:
def CurSelect(evt):
list_2.delete(0,END)
selected = list_1.get(list_1.curselection())
for i in range(2):
list_2.insert(END,i)
单击list_1中的一个项目会在list_2中插入项目。
如果我选择了List_2的项目,则会显示:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\XXX\Anaconda3\lib\tkinter\__init__.py", line 1699, in __call
__
return self.func(*args)
File "unbenannt.py", line 28, in CurSelect
selected = liste.get(liste.curselection())
File "C:\Users\XXX\Anaconda3\lib\tkinter\__init__.py", line 2792, in get
return self.tk.call(self._w, 'get', first)
_tkinter.TclError: bad listbox index "": must be active, anchor, end, @x,y, or a
number
在第一个列表框中选择时遇到了这种问题,但是用&lt;&lt;解决了这个问题。 ListboxSelect&GT;&GT;
之前点击第二个列表框中的项目有效,但从那时起我没有改变任何内容。
完整代码示例:
from tkinter import *
class Code():
def __init__(self):
Code.Window(self)
def Window(self):
root = Tk()
scrollbar = Scrollbar(root)
scrollbar.grid(row=4,rowspan=3,column=1,sticky=N+S+W)
liste = Listbox(root,selectmode=SINGLE,width=12,yscrollcommand=scrollbar.set)
liste.grid(row=4,rowspan=3,column=0)
for j in range(2):
liste.insert(END,j+5)
scrollbar.config(command=liste.yview)
scrollbar_2 = Scrollbar(root)
scrollbar_2.grid(row=4,rowspan=3,column=3,sticky=N+S+W)
eintrag = Listbox(root,selectmode=SINGLE,yscrollcommand=scrollbar_2.set)
eintrag.grid(row=4,rowspan=3,column=2,sticky=W)
def CurSelect(evt):
eintrag.delete(0,END)
selected = liste.get(liste.curselection())
for i in range(2):
eintrag.insert(END,str(i)+str(selected))
liste.bind('<<ListboxSelect>>',CurSelect)
root.mainloop()
Code()
这个例子没有任何用处,但无论如何都会出现问题。
答案 0 :(得分:0)
问题是默认情况下,一次只能有一个列表框可供选择。当您在第二个列表框中选择某些内容时,将从第一个列表框中删除该选择。当发生这种情况时,您的绑定会触发,但绑定的函数会假定liste.curselection()
返回非空字符串。
最简单的解决方案是允许两个列表框同时进行选择。您可以将exportselection
属性设置为False
:
liste = Listbox(..., exportselection=False)
...
eintrag = Listbox(..., exportselection=False)
答案 1 :(得分:0)
错误引发,因为当右侧列表框eintrag
获得焦点时,左侧列表框liste
中选择的任何项目都会被取消选中并调用'<<ListboxSelect>>'
的事件回调,其中假设liste.curselection()
永远不会为空,这在此特定情况下是不真实的,因此{{1在尝试获取索引为liste.get(liste.curselection())
的项目时抛出错误。
使用""
嵌套整个事件处理程序可以解决问题:
if