web-dev-qa-db-fra.com

Recevoir un rappel lorsqu'une sélection de Tkinter Listbox est modifiée?

Il existe plusieurs façons d'obtenir des rappels lorsque les widgets Text ou Entry sont modifiés dans Tkinter, mais je n'en ai pas trouvé un pour les Listbox (cela n'aide pas une grande partie de la documentation sur l'événement que je peux trouver est ancienne ou incomplète). Existe-t-il un moyen de générer un événement pour cela?

40
bfops

Vous pouvez vous lier à:

<<ListboxSelect>>
45
Bryan Oakley
def onselect(evt):
    # Note here that Tkinter passes an event object to onselect()
    w = evt.widget
    index = int(w.curselection()[0])
    value = w.get(index)
    print 'You selected item %d: "%s"' % (index, value)

lb = Listbox(frame, name='lb')
lb.bind('<<ListboxSelect>>', onselect)
61

J'ai eu le problème dont j'avais besoin pour obtenir le dernier élément sélectionné dans une zone de liste avec selectmode = MULTIPLE. Au cas où quelqu'un d'autre aurait le même problème, voici ce que j'ai fait:

lastselectionList = []
def onselect(evt):
    # Note here that Tkinter passes an event object to onselect()
    global lastselectionList
    w = evt.widget
    if lastselectionList: #if not empty
    #compare last selectionlist with new list and extract the difference
        changedSelection = set(lastselectionList).symmetric_difference(set(w.curselection()))
        lastselectionList = w.curselection()
    else:
    #if empty, assign current selection
        lastselectionList = w.curselection()
        changedSelection = w.curselection()
    #changedSelection should always be a set with only one entry, therefore we can convert it to a lst and extract first entry
    index = int(list(changedSelection)[0])
    value = w.get(index)
    tkinter.messagebox.showinfo("You selected ", value)
listbox = tk.Listbox(frame,selectmode=tk.MULTIPLE)
listbox.bind('<<ListboxSelect>>', onselect)
listbox.pack()
2
Alex