从列表框中选择,从另一个列表框中选择填充

时间:2017-12-21 13:09:42

标签: python tkinter listbox

我有两个列表框。单击第一个列表框中的项目将在第二个列表框中插入信息。

当我点击其中一个插入的项目时,出现错误。

列表框定义为:

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()

这个例子没有任何用处,但无论如何都会出现问题。

2 个答案:

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