DMarlon Studio

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().

tkinter · Listas de elementos en DMarlon Studio: el código del ejemplo y la ventana que abre al ejecutarlo

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.
  • selectmode decide si se elige uno o varios.
  • selection_set elige 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).