2017-12-21 2 views
-1

두 개의 목록 상자가 있습니다. 첫 번째 목록 상자의 항목을 클릭하면 두 번째 목록에 정보가 삽입됩니다.목록 상자에서 선택 다른 목록 상자에서 선택하여 채워집니다

삽입 된 항목 중 하나를 클릭하면 오류가 발생합니다.

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_1 = Listbox(root,selectmode=SINGLE) 
list_2 = Listbox(root,selectmode=SINGLE) 

선택한 항목을 얻으려면 :

리스트 박스

는 다음과 같이 정의된다 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 

내가 첫 번째 목록 상자에서 선택 이런 종류의 문제를했지만 >> < < 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() 

이 예는 아무것도 유용하지 않지만, 문제는 어쨌든 나타납니다.

+1

기쁨 완전한 [mcve] 만든다. –

+0

ok 잠시만 – Wolfmercury

+0

코드가 제대로 작동하는 것 같습니다. 그러나이 코드는 사용자가 말하는 오류를 생성하지 않습니다. _actual_ 코드와 _actual_ 오류를 게시하십시오. –

답변

0

기본적으로 한 번에 하나의 목록 상자 만 선택할 수 있습니다. 두 번째 목록 상자에서 항목을 선택하면 첫 번째 목록 상자에서 선택 항목이 제거됩니다. 그런 일이 발생하면 바인딩이 실행되지만 바인딩 된 함수는 liste.curselection()이 비어 있지 않은 문자열을 반환한다고 가정합니다.

가장 간단한 해결 방법은 두 목록 상자가 동시에 선택 항목을 가질 수있게하는 것입니다. 당신이 그 설정하여 exportselection 속성 False에 :

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

고맙습니다. 저에게 잘 맞았고, 원했던 그대로였습니다. 미안 해요. 나는 그 문제를 이해하지만, 혼자서 그것에 대해 생각하지는 않을 것이다. – Wolfmercury

0

오류 발생합니다 오른쪽 측면 목록 상자, eintrag가 포커스를 얻었을 때에 때문에, 왼쪽 측면 목록 상자에서 선택한 모든 항목, liste, 해제 얻고 그게 liste.curselection() 인 것으로 가정되는 '<<ListboxSelect>>'에 대한 이벤트 콜백을 호출 결코이 특정한 경우에 사실이며이있는 항목을 가져 오려고 시도로, 따라서 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)) 
+0

감사합니다. 이것은 기능적 대답입니다. – Wolfmercury

관련 문제