2016-07-08 10 views
0

私はちょうどこの問題に出くわしました、そして今私は数時間の間、私を夢中にしています... 私はListboxをいくつか持っています。 onSelectedという関数にバインドされた<<ListboxSelect>>イベントをバインドします。Tkinter:「アクティブ」アイテムが更新される前にスローされた<< ListboxSelect >>イベントですか?

この関数は、選択された項目を印刷する必要がありますが、ここに問題があります。新しいアクティブアイテムを最後に印刷します。

ここだが、一例である:

アイテム1-アイテム2-アイテム1-アイテム2-アイテム1

をし、この: 私は2つのアイテム、アイテム1とアイテム2を持って、私は次の順序でそれらを選択します

アイテム1-アイテム1アイテム2--アイテム1アイテム2-

:出力されます

明らかに最初のものが動作しますが、そこからは、「アクティブな」アイテムが更新される前にイベントがスローされ、最後の「アクティブな」アイテムが出力されるようです。明らかに、同じアイテムを2回クリックすると、意図したとおりに動作します。

回避策はありますか?リストボックスがupdate_idletasks()で更新されるのを待ってみましたが、問題は解決しませんでした。 ここで何ができますか?

ありがとうございます!

EDIT:

誰かが...コードを求めた:第二の印刷は、常に最初のもの以外はFalseであること

self.phase = tk.Listbox(self, exportselection = False, selectmode='single') 
self.phase.bind('<<ListboxSelect>>', self.onselect) 

def onselect(self, evt): 
    print(self.phase.get('active')) 
    print(self.phase.select_includes(self.phase.index('active'))) 

注意。

+0

'<< ListboxSelect >>'イベントは、選択が変更されるまで発生しません。そのイベントにバインドされたハンドラから 'curselection'を呼び出すと、常に現在選択されている項目が取得されます。 –

+0

それはなぜ私が2番目の印刷行にFalseを得ているのかを説明するはずです。私は 'curselection'から' get( 'active') 'ではなくactiveアイテムを取得しようとします。 –

答えて

0

"アクティブ"要素は選択と同じではなく、ボタンのリリース時に更新されます。アクティブな要素が現在の選択範囲よりも遅れる可能性があります。選択した項目はボタンを押すと更新されます。実際、ボタンクリック時のアクティブな要素の更新は文書化されていないため、プラットフォーム固有の可能性があります。アクティブな要素は主にキーボードでリストボックスをナビゲートするためのもので、マウスを使用する場合は特に関係ありません。

選択したアイテムを取得する場合は、curselectionを使用してください。アクティブな要素について本当に気にしているのであれば、<ButtonRelease>にバインドしてバインドする必要があります。バインドはtkinterクラスのバインディングの後に行われます。

関連する問題

 関連する問題