En este post voy a mostrar como Crear un treeview con Tkinter en Python para ser utilizado en nuestras aplicaciones de escritorio.
Qué es un TreeView ?
Un TreeView, también conocido como árbol de vista, es un elemento de interfaz gráfica de usuario (GUI) que se utiliza para mostrar datos jerárquicamente en forma de árbol. Es treeview es utilizado en software para presentar información organizada en categorías o niveles, donde cada nodo del árbol puede contener datos o estar vinculado a otras subcategorías, dependiendo de las necesidades del desarrollador .
Tkinter Treeview
El widget ttk.Treeview de Tkinter Python muestra una colección en árbol de elementos. Cada elemento tiene una etiqueta textual, una imagen opcional y una lista opcional de valores de datos. Los valores de datos se muestran en columnas sucesivas después de la etiqueta de árbol.
Usar un treeview en Tkinter Python es una tarea bastante sencilla y nos podría servir para mostrar datos obtenidos de archivos como bases de datos.
Ejemplo Treeview Tkinter Python
El siguiente ejemplo muestra la facilidad con la que puede crearse una vista de árbol o treeview con Python y Tkinter.
import tkinter as tk
from tkinter import ttk
def crear_tree(tree):
# Insertar datos en el Treeview
tree.insert("", "0", "item1", text="Item 1")
tree.insert("item1", "end", text="Subitem 1.a")
tree.insert("", "1", "item2", text="Item 2")
tree.insert("item2", "end", text="Subitem 2.a")
root = tk.Tk()
root.title("Amoprogramar ")
# Crear el TreeView
tree = ttk.Treeview(root)
tree.pack()
# Agregar columnas (opcional)
tree["columns"] = ("one", "two")
tree.column("#0", width=100, minwidth=100, stretch=tk.NO)
tree.column("one", width=150, minwidth=100, stretch=tk.NO)
# Encabezados de columna (opcional)
tree.heading("#0", text="Nombre", anchor=tk.W)
tree.heading("one", text="Compras ", anchor=tk.W)
# Llenar el TreeView con datos
crear_tree(tree)
root.mainloop()
Importar ttk
El primer paso para crear nuestro treeview con Python es importar tkinter y ttk para acceder a todos los widgets disponibles.
import tkinter as tk
from tkinter import ttk
Luego vamos a declar una variable para nuestro treeview. En este caso la hemos nombrado tree, por ser la palabra más fácil de recordar y de acuerdo al objetivo. Y para mostrar nuestro treeview usamos pack().
tree = ttk.Treeview(root)
tree.pack()
Agregar columnas al treeview
Con las siguientes líneas añadimos columnas a nuestro treeview. Donde con tree.column("one", width=150, minwidth=100, stretch=tk.NO), definimos el nombre de la columna, el ancho y el mínimo de ancho al cual se puede ajustar nuestra columna del treeview y algo más que hemos declarado , es que nuestra columna no se puede ancharse , esto se hace con eso stretch=tk.NO.
tree["columns"] = ("one")
tree.column("#0", width=100, minwidth=100, stretch=tk.NO)
tree.column("one", width=150, minwidth=100, stretch=tk.NO)
Encabezados del Treeview Tkinter
Ya sabemos que toda vista de árbol necesita un encabezado para dar sentido y organiazación a los datos mostrados en un treeview, y Tkinter Python no es la excepción pues nos ofrece una manera muy sencilla de listar encabezados a las columnas a tráves de tree.heading("one", text="Compras ", anchor=tk.W), donde "one" se refiere al nombre de la columna que declaramos anteriormente.
tree.heading("#0", text="Nombre", anchor=tk.W)
tree.heading("one", text="Compras ", anchor=tk.W)
A partir de ahora iniciaremos a crear nuestro Treeview en Tkinter Python, paso a paso. Así sigue las indicaciones.
Presentar de Sqlite3 en Treeview de Tkinter
Lo primero que haremos será crea una base de datos sqlite3 con datos de ropa comprada en una tienda. El propósito de la bases de datos es que los valores van a ser reflejados en el treeview de tkinter.
import sqlite3
conn = sqlite3.connect("compras.db")
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS compras (
id INTEGER PRIMARY KEY,
producto TEXT,
cantidad INTEGER
)
""")
compras = [
("camisas", 100),
("pantalones", 130),
("chaquetas", 12),
("gorras", 87)
]
cursor.executemany("INSERT INTO compras (producto, cantidad) VALUES (?, ?)", compras)
}
conn.commit()
conn.close()
Crear Treeview con item seleccionables
Primeramente vamos crear un treeview que una lista de items randoms. Una de las funciones que más nos interesa en este ejemplo a continuación , es que los items se pueden seleccionar desde el treview y luego podríamos editar en otra ventana el item seleccionadp. Copia y pega este código.
import tkinter as tk
from tkinter import ttk
from tkinter.messagebox import showinfo
class StoreItem:
def __init__(self, name, category, price):
self.name = name
self.category = category
self.price = price
root = tk.Tk()
root.title('Tienda - Objetos Comprados')
root.geometry('620x200')
# Define las columnas
columns = ('name', 'category', 'price')
tree = ttk.Treeview(root, columns=columns, show='headings')
# Define los encabezados
tree.heading('name', text='Nombre del Objeto')
tree.heading('category', text='Categoría')
tree.heading('price', text='Precio')
# Genera datos de muestra
store_items = [
StoreItem('Camisa', 'Ropa', 25.99),
StoreItem('Pantalón', 'Ropa', 39.99),
StoreItem('Gorra', 'Accesorio', 12.49),
StoreItem('Zapatos', 'Calzado', 54.99)
]
# Agrega datos al Treeview
for item in store_items:
tree.insert('', tk.END, values=(item.name, item.category, item.price))
def item_selected(event):
for selected_item in tree.selection():
item = tree.item(selected_item)
record = item['values']
formatted_price = '{:.2f}'.format(float(record[2])) # Convertir a float y formatear el precio a dos decimales
showinfo(title='Información', message=f'Nombre: {record[0]}\nCategoría: {record[1]}\nPrecio: ${formatted_price}')
tree.bind('<<TreeviewSelect>>', item_selected)
tree.grid(row=0, column=0, sticky='nsew')
# Agrega una barra de desplazamiento
scrollbar = ttk.Scrollbar(root, orient=tk.VERTICAL, command=tree.yview)
tree.configure(yscroll=scrollbar.set)
scrollbar.grid(row=0, column=1, sticky='ns')
# Ejecuta la aplicación
root.mainloop()
Ejemplo Tkinter Treeview + Sqlite
Ahora bien , en el siguiente ejemplo vamos a acceder a los valores almacenados en la base de datos, y luego vamos a mostrar los items guardados en nuestro treeview.
import tkinter as tk
from tkinter import ttk
from tkinter.messagebox import showinfo
import sqlite3
root = tk.Tk()
root.title('Tienda - Objetos Comprados')
root.geometry('620x200')
# Conectar a la base de datos
conn = sqlite3.connect("compras.db")
cursor = conn.cursor()
# Define las columnas
columns = ('producto', 'cantidad')
tree = ttk.Treeview(root, columns=columns, show='headings')
# Define los encabezados
tree.heading('producto', text='Producto')
tree.heading('cantidad', text='Cantidad')
# Consulta los datos de la base de datos y agrega al Treeview
cursor.execute("SELECT producto, cantidad FROM compras")
compras = cursor.fetchall()
for compra in compras:
tree.insert('', tk.END, values=compra)
def item_selected(event):
for selected_item in tree.selection():
item = tree.item(selected_item)
record = item['values']
showinfo(title='Información', message=f'Producto: {record[0]}\nCantidad: {record[1]}')
tree.bind('<<TreeviewSelect>>', item_selected)
tree.grid(row=0, column=0, sticky='nsew')
# Agrega una barra de desplazamiento
scrollbar = ttk.Scrollbar(root, orient=tk.VERTICAL, command=tree.yview)
tree.configure(yscroll=scrollbar.set)
scrollbar.grid(row=0, column=1, sticky='ns')
# Cerrar la conexión a la base de datos
conn.close()
# Ejecuta la aplicación
root.mainloop()
Una de las importancias de hacer un treeview con Tkinter y Python es que podemos presentar los datos almacenados en una base de datos, además podremos realizar funciones más complejas como la edición de los valores guardados en la base de datos al dar doble click en un treeview de tkinter desde Python.