Entrada

Tkinter - Widget ttk.Treeview


Tkinter - Widget ttk.Treeview

El widget ttk.Treeview de Tkinter permite presentar información en forma tabular o jerárquica, similar a un explorador de archivos o a una tabla con filas y columnas. Su estructura permite crear vistas organizadas y navegar datos complejos dentro de una interfaz gráfica desarrollada en Python.

Introducción a ttk.Treeview

El widget se comporta como un contenedor que puede almacenar elementos llamados ítems. Cada uno puede contener datos asociados a columnas, así como hijos y subhijos, lo que lo hace útil para representar árboles jerárquicos. Cuando se configura en modo de tabla, puede funcionar como un reemplazo de widgets como Listbox, pero con un formato más avanzado.

Para usarlo es necesario importar los módulos base:

1
2
import tkinter as tk
from tkinter import ttk

Creación básica de un Treeview

El uso mínimo consiste en crear una instancia, agregarla a un contenedor y poblarla con ítems.

1
2
3
4
root = tk.Tk()
tree = ttk.Treeview(root)
tree.pack(fill="both", expand=True)
root.mainloop()

En este estado, el widget no muestra columnas visibles ni encabezados. Para trabajar con datos estructurados, es necesario configurar columnas y títulos.

Creación de columnas y encabezados

El Treeview utiliza una columna especial llamada columna raíz o columna principal. Esta se identifica mediante el carácter #0 y existe siempre, incluso cuando se declaran columnas adicionales.

El siguiente ejemplo muestra una configuración típica para columnas:

1
2
3
4
5
6
7
8
tree = ttk.Treeview(root, columns=("nombre", "edad", "ciudad"), show="headings")
tree.heading("nombre", text="Nombre")
tree.heading("edad", text="Edad")
tree.heading("ciudad", text="Ciudad")

tree.column("nombre", width=150)
tree.column("edad", width=70, anchor="center")
tree.column("ciudad", width=120)

El argumento show="headings" oculta la columna raíz #0 y muestra únicamente los encabezados definidos. Si se requiere una estructura jerárquica, se omite ese parámetro para mostrar #0.

Inserción de ítems

Los ítems se insertan mediante el método insert. Este permite especificar el elemento padre, la posición y los valores de sus columnas.

1
2
tree.insert("", "end", values=("María", 28, "Santiago"))
tree.insert("", "end", values=("Pedro", 31, "Valparaíso"))

El argumento "" significa que el ítem se inserta en el nivel raíz, mientras que "end" indica que se agrega al final de la lista.

Inserción de datos jerárquicos

Para representar un árbol, se utiliza la columna #0 y se asignan hijos a un ítem identificado por su id interno, que retorna el método insert.

1
2
3
4
5
6
tree = ttk.Treeview(root)
tree.pack(fill="both", expand=True)

padre = tree.insert("", "end", text="Carpeta principal")
tree.insert(padre, "end", text="Documento1.txt")
tree.insert(padre, "end", text="Documento2.txt")

Esto crea un árbol con una carpeta y dos archivos como hijos.

Obtención de valores y selección de ítems

El Treeview permite recuperar la selección actual usando:

1
seleccion = tree.selection()

Una vez obtenido el identificador, se puede recuperar información con:

1
2
item = tree.item(seleccion)
print(item["values"])

En jerarquías, item["text"] corresponde al contenido de la columna #0.

Actualización de datos

Los valores de un ítem se pueden actualizar modificando sus campos:

1
tree.item(seleccion, values=("Nuevo nombre", 20, "Nuevo lugar"))

También se pueden cambiar el texto principal o estilos.

Eliminación de ítems

Para eliminar un elemento específico:

1
tree.delete(seleccion)

Para borrar todos los elementos:

1
2
for elemento in tree.get_children():
    tree.delete(elemento)

Scrollbars

El Treeview no añade barras de desplazamiento automáticamente. Es necesario vincularlas manualmente.

1
2
3
4
scroll_y = ttk.Scrollbar(root, orient="vertical", command=tree.yview)
scroll_y.pack(side="right", fill="y")

tree.configure(yscrollcommand=scroll_y.set)

La misma lógica aplica para barras horizontales.

Ejemplo completo: tabla con selección y edición

El siguiente ejemplo integra configuración de columnas, inserción de datos, selección de ítems y actualización.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.title("Ejemplo Completo Treeview")

tree = ttk.Treeview(root, columns=("nombre", "edad", "ciudad"), show="headings")
tree.heading("nombre", text="Nombre")
tree.heading("edad", text="Edad")
tree.heading("ciudad", text="Ciudad")

tree.column("nombre", width=150)
tree.column("edad", width=70, anchor="center")
tree.column("ciudad", width=120)

tree.pack(fill="both", expand=True)

datos = [
    ("Carla", 23, "Concepción"),
    ("Diego", 29, "La Serena"),
    ("Laura", 35, "Iquique")
]

for fila in datos:
    tree.insert("", "end", values=fila)

def mostrar_seleccion():
    seleccion = tree.selection()
    if seleccion:
        item = tree.item(seleccion)
        print("Seleccionado:", item["values"])

boton = ttk.Button(root, text="Mostrar selección", command=mostrar_seleccion)
boton.pack(pady=10)

root.mainloop()

Este ejemplo genera una tabla completa y funcional, imprime los valores seleccionados y ejemplifica el flujo básico de interacción con el widget.

Uso de estilos y personalización

El módulo ttk.Style permite modificar la apariencia del Treeview. Es posible cambiar colores alternos en filas, tamaño de fuente y aspectos visuales generales.

1
2
3
4
estilo = ttk.Style()
estilo.configure("Treeview", font=("Arial", 11))
estilo.configure("Treeview.Heading", font=("Arial", 12, "bold"))
estilo.map("Treeview", background=[("selected", "#d0d0d0")])

Algunos estilos requieren versiones específicas de Tk o sistemas operativos compatibles.

Conclusión

El widget ttk.Treeview constituye una herramienta avanzada para mostrar datos estructurados dentro de interfaces gráficas en Python. Su capacidad de manejar columnas, jerarquías y estilos lo convierte en un componente clave para aplicaciones que demandan vistas complejas. Con una comprensión adecuada de sus métodos y propiedades, es posible construir tablas, exploradores y visualizadores altamente funcionales y personalizables.

Esta entrada está licenciada bajo CC BY 4.0 por el autor.