Search code examples
pythoneventstkinter

Getting a callback when a Tkinter Listbox selection is changed?


There are a number of ways of getting callbacks when Text or Entry widgets are changed in Tkinter, but I haven't found one for Listbox's (it doesn't help that much of the event documentation I can find is old or incomplete). Is there some way of generating an event for this?


Solution

  • You can bind to the <<ListboxSelect>> event. This event will be generated whenever the selection changes, whether it changes from a button click, via the keyboard, or any other method.

    Here's a simple example which updates a label whenever you select something from the listbox:

    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

    This event is mentioned in the canonical man page for listbox. All predefined virtual events can be found on the bind man page.