Lección 9 · 9 de 20
Listas de elementos · tkinter
La Listbox de tkinter: añadir elementos, dejar uno o varios elegidos con selection_set, selectmode y leer la selección con curselection().

Una Listbox (tk.Listbox) muestra una lista de textos. Se rellena con insert("end", *fruits): el asterisco pasa cada fruta como un argumento aparte, así que entran todas de una vez.
`selectmode` dice cuántos elementos se pueden elegir: "browse" (el valor por defecto), solo uno; "multiple", varios, y cada clic marca o desmarca; "extended", varios con las teclas Mayúsculas y Control (Cmd en macOS).
`selection_set(índice)` deja elegido un elemento por su posición, empezando en 0: en la primera lista, 2 es «Cherry». exportselection=False hace falta cuando hay dos listas: sin esa opción, elegir en una borraría la selección de la otra.
`curselection()` devuelve las posiciones elegidas y get(i) el texto de cada una. El evento <<ListboxSelect>> llega cada vez que cambia la selección, y show escribe los nombres en la etiqueta de abajo.
make_list crea cada columna: un ttk.Frame con su título y su lista, colocado con pack(side="left", fill="both", expand=True) para repartir el ancho. En DMarlon Studio es la Lista de la paleta: sus *Elementos (uno por línea)* y la *Selección* (selectmode) se ponen en el inspector, y tiene el evento *Al seleccionar*.
Código · main.py
import tkinter as tkfrom tkinter import ttkroot = tk.Tk()root.title("Listbox")root.geometry("480x320")fruits = ["Apple", "Banana", "Cherry", "Grape", "Mango", "Orange", "Pear"]status = ttk.Label(root, foreground="#1d4ed8")status.pack(side="bottom", pady=(0, 12))def show(listbox): names = [listbox.get(i) for i in listbox.curselection()] status.config(text="Selected: " + (", ".join(names) or "none"))def make_list(title, mode, selected): box = ttk.Frame(root, padding=12) box.pack(side="left", fill="both", expand=True) ttk.Label(box, text=title).pack(anchor="w", pady=(0, 4)) # exportselection=False: each list keeps its own selection. lb = tk.Listbox(box, selectmode=mode, height=7, exportselection=False) lb.pack(fill="both", expand=True) lb.insert("end", *fruits) for index in selected: lb.selection_set(index) lb.bind("<<ListboxSelect>>", lambda event: show(lb)) return lbmake_list("One item (browse)", "browse", [2])many = make_list("Several items (multiple)", "multiple", [0, 3, 4])show(many)root.mainloop()Para recordar
insert("end", ...)añade elementos al final.selectmodedecide si se elige uno o varios.selection_setelige por código;curselection()lee lo elegido.<<ListboxSelect>>avisa cuando cambia la selección.
Ejercicio
Cambie la segunda lista a selectmode="extended" y añada un botón que borre los elementos elegidos con delete(i).