2016-07-08 7 views
0

Also ich bin gerade auf dieses Problem gestoßen, und es macht mich verrückt für ein paar Stunden jetzt ... Ich habe eine Listbox mit mehreren Elementen darauf. Ich binde das Ereignis <<ListboxSelect>> gebunden an eine Funktion mit dem Namen onSelected.Tkinter: << ListboxSelect >> Ereignis ausgelöst, bevor das 'aktive' Element aktualisiert wird?

Diese Funktion sollte das Element drucken, das ausgewählt wurde, aber hier ist das Problem. Es druckt den letzten aktiven Artikel statt den neuen.

Hier ist ein Beispiel: I 2 Einzelteile haben, element1 und Element2, wähle ich sie in der folgenden Reihenfolge:

element1-Element2-element1-Element2-element1

und diese Ausgang:

Item1-Item1-Item2-Item1-Item2

Offensichtlich funktioniert der erste, aber von dort wird das Ereignis ausgelöst, bevor der 'aktive' Gegenstand aktualisiert wird und der letzte 'aktive' Gegenstand gedruckt wird. Wenn ich zweimal auf denselben Gegenstand klicke, funktioniert es natürlich wie beabsichtigt.

Gibt es einen Workaround dafür? Ich habe versucht zu warten, dass die Listbox mit update_idletasks() aktualisiert, aber das Problem nicht gelöst. Was kann ich hier tun?

Vielen Dank im Voraus!

EDIT:

Jemand für Code gefragt ...:

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

Beachten Sie, dass der zweite Druck neben dem ersten immer falsch ist.

+0

'<< ListboxSelect >>' Ereignisse werden nicht ausgelöst, bis die Auswahl geändert wurde; Das Aufrufen von 'curselection' von einem Handler, der an dieses Ereignis gebunden ist, sollte immer die aktuell ausgewählten Elemente enthalten. –

+0

Das sollte erklären, warum ich auf der zweiten Druckzeile False bekomme. Ich werde versuchen, den aktiven Gegenstand von 'curselection' zu bekommen anstatt 'get (' active ')' ... –

Antwort

0

Das Element "active" ist nicht dasselbe wie die Auswahl und wird bei der Freigabe der Taste aktualisiert. Sie haben Recht, dass das aktive Element hinter der aktuellen Auswahl zurückbleiben kann. Die ausgewählten Elemente werden beim Drücken der Taste aktualisiert. Tatsächlich ist das Aktualisieren des aktiven Elements bei einem Klick auf eine Schaltfläche nicht dokumentiert, so dass es plattformspezifisch sein kann. Das aktive Element dient hauptsächlich zum Navigieren in der Listbox mit der Tastatur und ist bei der Verwendung der Maus nicht besonders relevant.

Wenn Sie das ausgewählte Objekt erhalten möchten, verwenden Sie curselection. Wenn Sie sich wirklich für das aktive Element interessieren, müssen Sie an <ButtonRelease> binden und die Bindtags so anordnen, dass Ihre Bindung nach der tkinter-Klassenbindung erfolgt.

Verwandte Themen