2017-12-21 48 views
-1

私は2つのリストボックスを持っています。最初のリストボックスの項目をクリックすると、2番目のリストボックスに情報が挿入されます。別のリストボックスから選択してリストボックスから選択してください

挿入したアイテムの1つをクリックすると、エラーが発生します。

リストボックスのように定義される:list_1の項目をクリックはでアイテムを挿入

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.bind('<<ListboxSelect>>',CurSelect) 

を指す:選択された項目を取得する

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でそれを解決しました。

2番目のリストボックスのアイテムを以前にクリックしても機能しましたが、それ以降は何も変更されませんでした。

完全なコード例:

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]完全を作成します。

ifとネスティング全体のイベントハンドラは、問題が解決されます。 –

+0

okすぐに – Wolfmercury

+0

あなたのコードはうまく動作するようです。しかし、このコードはあなたが言うエラーを生成しないことは明らかです。 _actual_コードと_actual_エラーを投稿してください。 –

答えて

0

問題は、デフォルトでは、一度に1つのリストボックスだけが選択肢を持つことができるということです。 2番目のリストボックスで何かを選択すると、最初のリストボックスから選択が削除されます。それが起こるとバインディングが発生しますが、バインドされた関数はliste.curselection()が空でない文字列を返すとみなします。

最も簡単な解決策は、両方のリストボックスに同時に選択を許可することです。 、右手側のリストボックス、eintragは、フォーカスを取得するときので

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

ありがとうございました、私にとってはうまくいっていて、まさに私が欲しいものでした。申し訳ありません。 私はこの問題を理解していますが、それは自分では考えていませんでした。 – Wolfmercury

0

エラーは、左手側のリストボックスで選択した任意の項目を提起する:あなたはFalseexportselection属性を設定することによって、それを行いますliste選択解除取得し、それがliste.curselection()であることを想定した'<<ListboxSelect>>'のイベントコールバックを呼び出す決してこの特定の場合に真実であり、それが入っているアイテムを取得しようとしてこのようliste.get(liste.curselection())がエラーをスローれ、空インデックスは""です。

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

関連する問題