2017-12-21 3 views
-1

Ich habe zwei Listboxen. Wenn Sie auf ein Element der ersten Listbox klicken, werden Informationen in die zweite Listbox eingefügt.Auswahl aus Listbox, die durch Auswahl aus einer anderen Listbox gefüllt wird

Wenn ich auf eines der eingefügten Elemente klicke, erhalte ich einen Fehler.

Die Listboxen sind definiert als:

list_1 = Listbox(root,selectmode=SINGLE) 
list_2 = Listbox(root,selectmode=SINGLE) 

das ausgewählte Element zu erhalten:

list_1.bind('<<ListboxSelect>>',CurSelect) 

, die sich bezieht:

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) 

Ein Klick auf ein Element von list_1 fügt Artikel

in Liste_2.

Wenn ich einen Artikel von List_2 wähle dies erscheint:

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 

ich diese Art von Problem hatte, als in den ersten Listbox Auswahl, aber es gelöst mit < < ListboxSelect >>.

Zuvor Elemente in der zweiten Listbox funktioniert, obwohl ich seitdem nichts geändert habe.

Vollcodebeispiel:

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

Dieses Beispiel ist nicht etwas Sinnvolles machen, aber das Problem scheint sowieso.

+1

Pleaser ein komplettes [MCVE] erstellen. –

+0

ok nur einen Moment – Wolfmercury

+0

Ihr Code scheint für mich gut zu funktionieren. Es ist jedoch klar, dass dieser Code nicht den Fehler erzeugt, von dem Sie sagen, dass er dies tut. Bitte posten Sie _actual_ code und den _actual_ error, den Sie erhalten. –

Antwort

0

Das Problem ist, dass standardmäßig nur eine Listbox eine Auswahl zu einer Zeit haben kann. Wenn Sie etwas in der zweiten Listbox auswählen, wird die Auswahl aus der ersten Listbox entfernt. Wenn das passiert, löst Ihre Bindung aus, aber Ihre gebundene Funktion setzt voraus, dass liste.curselection() eine nicht leere Zeichenfolge zurückgibt.

Die einfachste Lösung besteht darin, dass beide Listenfelder gleichzeitig ausgewählt werden können. Sie tun das, indem dem exportselection Attribut False:

liste = Listbox(..., exportselection=False) 
... 
eintrag = Listbox(..., exportselection=False) 
+0

Vielen Dank, das hat gut für mich funktioniert und genau das, was ich wollte, tut mir leid, wenn meine Antworten in irgendeiner Weise aggressiv sind. Ich unterschätze das Problem, hätte aber nicht selbst darüber nachgedacht. – Wolfmercury

0

Der Fehler auslöst, weil, wenn das rechte seitige Listenfeld eintrag, konzentrieren wird, jedes Element in dem linken seitigen Listenfeld ausgewählt, liste, bekommt abgewählt und ruft den Ereignisrückruf für '<<ListboxSelect>>' in der angenommen wird, dass liste.curselection() ist nie leer, die in diesem speziellen Fall nicht wahr ist und somit werfen liste.get(liste.curselection()) die Fehler, da es ein Element zu erhalten versucht, das in ist der Index "".

Nesting gesamte Event-Handler mit einem if behebt das Problem:

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)) 
+0

Danke, das ist auch eine funktionale Antwort! – Wolfmercury

Verwandte Themen