从列表框中选择,从另一个列表框中选择填充
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从列表框中选择,从另一个列表框中选择填充相关的知识,希望对你有一定的参考价值。
我有两个列表框。单击第一个列表框中的项目将在第二个列表框中插入信息。
当我点击其中一个插入的项目时,出现错误。
列表框定义为:
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
在第一个Listbox中选择时遇到了这种问题,但是用<< ListboxSelect >>解决了它。
以前单击第二个列表框中的项目有效,但从那以后我没有更改任何内容。
完整代码示例:
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()
这个例子没有任何用处,但无论如何都会出现问题。
问题是默认情况下,一次只能有一个列表框可供选择。当您在第二个列表框中选择某些内容时,将从第一个列表框中删除该选择。当发生这种情况时,您的绑定会触发,但您的绑定函数会假定liste.curselection()
返回非空字符串。
最简单的解决方案是允许两个列表框同时进行选择。你可以通过将exportselection
属性设置为False
来实现:
liste = Listbox(..., exportselection=False)
...
eintrag = Listbox(..., exportselection=False)
该错误引发,因为当右侧列表框eintrag
获得焦点时,左侧列表框中选择的任何项目liste
将被取消选择并调用'<<ListboxSelect>>'
的事件回调,其中假设liste.curselection()
永远不会是空的,这在这种特殊情况下是不真实的,因此liste.get(liste.curselection())
会在尝试获取""
索引中的项目时抛出错误。
使用if
嵌套整个事件处理程序可以解决此问题:
def CurSelect(evt):
if liste.curselection(): # To call below statements only when liste has a selected item
eintrag.delete(0,END)
selected = liste.get(liste.curselection())
for i in range(2):
eintrag.insert(END,str(i)+str(selected))
以上是关于从列表框中选择,从另一个列表框中选择填充的主要内容,如果未能解决你的问题,请参考以下文章