54 votes

Obtenir un callback lorsque la sélection d'une Listbox Tkinter est modifiée ?

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

3 votes

Tous les événements virtuels sont répertoriés sur le site : L'homme Tcl/Tk pages.

80voto

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)

5 votes

Un point mineur, mais cela n'imprime que la première des entrées sélectionnées. Si vous avez des sélections multiples, essayez quelque chose comme print 'You selected items: %s'%[w.get(int(i)) for i in w.curselection()]

1 votes

Dans Python 3.6.5, int(w.curselection()[0]) peut être remplacé par w.curselection()[0] car elle renvoie déjà un objet de type int. Remarquez que je n'ai pas essayé ceci avec une autre version de Python.

62voto

Bryan Oakley Points 63365

Vous pouvez vous lier à la <<ListboxSelect>> événement. Cet événement sera généré à chaque fois que la sélection change, que ce soit à la suite d'un clic sur un bouton, via le clavier, ou par toute autre méthode.

Voici un exemple simple qui met à jour une étiquette chaque fois que vous sélectionnez quelque chose dans la boîte de liste :

import tkinter as tk

root = tk.Tk()
label = tk.Label(root)
listbox = tk.Listbox(root)
label.pack(side="bottom", fill="x")
listbox.pack(side="top", fill="both", expand=True)

listbox.insert("end", "one", "two", "three", "four", "five")

def callback(event):
    selection = event.widget.curselection()
    if selection:
        index = selection[0]
        data = event.widget.get(index)
        label.configure(text=data)
    else:
        label.configure(text="")

listbox.bind("<<ListboxSelect>>", callback)

root.mainloop()

screenshot

Cet événement est mentionné dans le texte canonique page de manuel pour listbox . Tous les événements virtuels prédéfinis peuvent être trouvés sur le site de l page de manuel de bind .

2 votes

Parfait, merci. Savez-vous où je peux trouver de la documentation sur tous les événements personnalisés pris en charge par les widgets ?

1 votes

@RobotGymnast Try (Les pages de manuel Tcl/Tk)[ [tcl.tk/man/tcl8.5/TkCmd/event.htm#M41]](http://www.tcl.tk/man/tcl8.5/TkCmd/event.htm#M41]) (d'après la réponse de Bill ci-dessous)

4voto

Alex Points 335

J'ai eu le problème suivant : j'avais besoin d'obtenir le dernier élément sélectionné dans une boîte 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()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X