Ir al contenido

Árbol

Un panel de proyecto: carpetas plegables, un icono por tipo de archivo y colores de estado de git. TreeNode.from_paths(paths, status=...) crea los nodos, pone las carpetas primero y propaga el estado de git a las carpetas con cambios. El id de cada nodo es su ruta; el conjunto expanded y el id selected son tuyos.

ui.tree · Categoría: Listas y menús · Referencia completa →

ÁrbolÁrbol
  • Para archivos y cualquier jerarquía: esquemas, categorías, secciones de ajustes.
  • status es "modified", "created", "deleted", "conflict" o "ignored".
import pyzed as pz
from pyzed import ui
class Explorer(pz.App):
def __init__(self):
self.nodes = ui.TreeNode.from_paths(["src/main.rs", "src/app.rs", "Cargo.toml"])
self.expanded = {"src"}
self.selected = None
def toggle(self, folder):
self.expanded ^= {folder}
def view(self):
return ui.tree(self.nodes, expanded=self.expanded, selected=self.selected,
on_toggle=self.toggle, on_select=lambda path: setattr(self, "selected", path))
Árbol: PlegadoÁrbol: Plegado
Plegado
Código
nodes = ui.TreeNode.from_paths(["src/main.rs", "src/app.rs", "src/ui/mod.rs", "src/ui/button.rs", "Cargo.toml"])
pz.container(ui.tree(nodes, expanded=set()), width=240)
Árbol: expanded={"src"}Árbol: expanded={"src"}
expanded={"src"}
Código
nodes = ui.TreeNode.from_paths(["src/main.rs", "src/app.rs", "src/ui/mod.rs", "src/ui/button.rs", "Cargo.toml"])
pz.container(ui.tree(nodes, expanded={"src"}), width=240)
Árbol: expanded={"src", "src/ui"}Árbol: expanded={"src", "src/ui"}
expanded={"src", "src/ui"}
Código
nodes = ui.TreeNode.from_paths(["src/main.rs", "src/app.rs", "src/ui/mod.rs", "src/ui/button.rs", "Cargo.toml"])
pz.container(ui.tree(nodes, expanded={"src", "src/ui"}, selected="src/ui/button.rs"), width=240)
Árbol: status=Árbol: status=
status=
Código
nodes = ui.TreeNode.from_paths(["src/app.rs", "src/new.rs", "src/old.rs", "build.log"],
status={"src/app.rs": "modified", "src/new.rs": "created", "src/old.rs": "deleted", "build.log": "ignored"})
pz.container(ui.tree(nodes, expanded={"src"}), width=240)
Árbol: "conflict"Árbol: "conflict"
"conflict"
Código
nodes = ui.TreeNode.from_paths(["merge.py", "ok.py"], status={"merge.py": "conflict"})
pz.container(ui.tree(nodes, expanded=set()), width=240)
Árbol: item_height=20, indent=10Árbol: item_height=20, indent=10
item_height=20, indent=10
Código
nodes = ui.TreeNode.from_paths(["src/main.rs", "src/app.rs", "src/ui/mod.rs", "src/ui/button.rs", "Cargo.toml"])
pz.container(ui.tree(nodes, expanded={"src", "src/ui"}, item_height=20, indent=10), width=240)
Árbol: item_height=30, indent=20Árbol: item_height=30, indent=20
item_height=30, indent=20
Código
nodes = ui.TreeNode.from_paths(["src/main.rs", "src/app.rs", "src/ui/mod.rs", "src/ui/button.rs", "Cargo.toml"])
pz.container(ui.tree(nodes, expanded={"src"}, item_height=30, indent=20), width=240)

on_open(id) se ejecuta con un doble clic en un archivo y on_context(id) con un clic derecho.

Árbol: Selección múltiple y focoÁrbol: Selección múltiple y foco
Selección múltiple y foco
Código
pz.container(ui.tree(ui.TreeNode.from_paths(["src/app.py", "src/ui.py", "README.md"]), expanded={"src"},
selected={"src/app.py", "README.md"}, focused="src/ui.py", on_open=on_open,
on_context=on_context), width=300)

Crea las rutas con pathlib y pásalas a from_paths.

from pathlib import Path
root = Path(".")
paths = [p.relative_to(root).as_posix() for p in root.rglob("*")
if p.is_file() and ".git" not in p.parts]
nodes = ui.TreeNode.from_paths(paths)

Las carpetas son nodos con children.

Árbol: Nodos a manoÁrbol: Nodos a mano

Árbol tiene 4 eventos propios, en la tabla de abajo. Como todo widget, también tiene los 18 eventos comunes (click, double_click, right_click, mouse_enter, drag, key_down, resize…), que se conectan con .on(...): mira Eventos y Eventos de cada componente.

Evento El handler recibe Cuándo
on_toggle (id) Se llama con el id de la carpeta pulsada.
on_select (id) Se llama con el id del archivo pulsado.
on_open (id) Recibe el id del archivo al que se hace doble clic.
on_context (id) Recibe el id de la fila en la que se hace clic derecho (muestra un ui.menu ahí).

El handler recibe es lo que Pyzed le pasa a tu función: () es nada. Cualquier handler también puede ser un mensaje (un valor que no se puede llamar), que va a update().

Los mismos eventos escritos de tres formas. Imperativa: métodos de la app que cambian self. Declarativa: los handlers producen mensajes y un único update() decide. Funcional: una función pura dibuja un estado inmutable y pide cambios con set_state(...). Mira Imperativo, declarativo y funcional.

class Explorer(pz.App):
def __init__(self):
self.nodes = ui.TreeNode.from_paths(["src/main.rs", "src/app.rs", "Cargo.toml"])
self.expanded = {"src"}
self.selected = None
def toggle(self, folder): # on_toggle: the folder's id (its path)
self.expanded ^= {folder}
def view(self):
return ui.tree(self.nodes, expanded=self.expanded, selected=self.selected,
on_toggle=self.toggle,
on_select=lambda path: setattr(self, "selected", path), # click on a file
on_open=lambda path: print("open", path), # double click
on_context=lambda path: print("menu for", path)) # right click
tree(
nodes,
*,
expanded,
selected=None,
on_toggle=None,
on_select=None,
on_open=None,
on_context=None,
focused=None,
indent=14,
item_height=24,
theme=None,
)

Un árbol de archivos plegable, como el panel de proyecto de un editor de código.

Propiedad Por defecto Descripción
nodes obligatorio Lista de TreeNode.
expanded obligatorio Conjunto de ids de carpetas abiertas.
selected None Un id o una colección de ids (selección múltiple).
focused None Resalta el borde de la fila en la que está el teclado.
indent 14 Sangría a la izquierda, en píxeles.
item_height 24 Alto de cada fila.
theme None Tema a usar en lugar del actual (pyzed.theme.current()).

Eventos: on_toggle, on_select, on_open, on_context (eventos).

Referencia completa →

@dataclass
class TreeNode(name, children=None, id=None, status=None, icon=None, icon_color=None)

Un archivo o carpeta para ui.tree. Las carpetas tienen children (lista). status es "modified", "created", "deleted", "conflict" o "ignored". TreeNode.from_paths(paths, status=None) construye el árbol a partir de rutas como "src/main.rs", con las carpetas primero y el estado de git propagado a las carpetas.

Propiedad Por defecto Descripción
name obligatorio Nombre visible.
children None Hijos (None si es un archivo).
id None Identificador estable para enfocarlo o desplazarlo con un Command.
status None Estado de git.
icon None Nombre de un icono de Lucide (pyzed icons los lista).
icon_color None Color del icono: un token del tema o un color hex.

Referencia completa →