# Spinner

> Un arco que gira para los estados de carga. Un componente nativo de Pyzed para GUIs de escritorio en Python, con vista previa, ejemplos y su API.

Source: https://albakore.github.io/pyzed/es/library/spinner/

:::tip[En pocas palabras]
Un círculo que gira y dice “espera, estoy en ello”.
:::

Un arco que gira. Su ángulo sale del reloj de la app, así que mantén una suscripción como `pz.every(1 / 30, ...)` mientras se muestra o no se moverá.

`ui.spinner` · Categoría: [Estado y avisos](https://albakore.github.io/pyzed/es/library/#estado-y-avisos) · [Referencia completa →](https://albakore.github.io/pyzed/es/reference/ui/#spinner)

**Código:**

```python
pz.row([
    ui.spinner(),
    ui.spinner(size=24, tint="success"),
    pz.row([ui.spinner(size=14), ui.muted("Indexing project…")], spacing=8, align="center"),
], spacing=24, align="center")
```

## Cuándo usarlo

- Para esperas cortas de duración desconocida: conectando, buscando, cargando un archivo.
- Para trabajos largos con avance conocido usa [Progreso](https://albakore.github.io/pyzed/es/library/progress/).

## Uso

```python
import pyzed as pz
from pyzed import ui

class Loader(pz.App):
    def __init__(self):
        self.loading = True

    def subscription(self):
        return pz.every(1 / 30, lambda: None) if self.loading else None

    def view(self):
        return ui.spinner() if self.loading else ui.label("Done")
```

## Variantes

:::note[Sobre estas capturas]
Cada captura la graba pyzed mismo, fuera de pantalla a 2x, en One Dark o One Light según el tema de este sitio, y recortada al componente para que se vea a su tamaño real. El puntero pasa por encima, pulsa o escribe en él; un componente que no reacciona al puntero recorre algunos temas. Con movimiento reducido ves el primer fotograma. Abre **Código** bajo una captura para ver el fragmento que la dibuja; los nombres libres como `on_save` son tus propios callbacks.
:::

### Tamaño

```python
ui.spinner(size=12)
```

```python
ui.spinner()
```

```python
ui.spinner(size=24)
```

```python
ui.spinner(size=36)
```

### Tinte

```python
ui.spinner(size=24, tint="success")
```

```python
ui.spinner(size=24, tint="warning")
```

```python
ui.spinner(size=24, tint="text_muted")
```

### Con texto

```python
pz.row([ui.spinner(size=14), ui.muted("Indexing project…")], spacing=8, align="center")
```

```python
ui.button(pz.row([ui.spinner(size=12, tint="text"), pz.text("Saving")], spacing=6, align="center"))
```

## Eventos

Spinner no tiene eventos propios: muestra lo que le das. 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](https://albakore.github.io/pyzed/es/guides/events/) y [Eventos de cada componente](https://albakore.github.io/pyzed/es/library/events/).

## Propiedades y API

### `ui.spinner`

```python
spinner(*, size=16, tint='accent', speed=1.0, theme=None)
```

Un arco que gira para estados de carga. Su ángulo sale del reloj, así que mantén una suscripción `pz.every(1/30, ...)` activa mientras se muestra.

| Propiedad | Por defecto | Descripción |
| --- | --- | --- |
| `size` | `16` | Tamaño. |
| `tint` | `"accent"` | Color semántico: `"accent"`, `"error"`, `"warning"`, `"success"`, `"info"` o un token. |
| `speed` | `1.0` | Vueltas por segundo. |
| `theme` | `None` | Tema a usar en lugar del actual (`pyzed.theme.current()`). |

[Referencia completa →](https://albakore.github.io/pyzed/es/reference/ui/#spinner)

## Relacionados

- [Progreso](https://albakore.github.io/pyzed/es/library/progress/): Una barra de progreso fina en un color semántico.
- [Estado vacío](https://albakore.github.io/pyzed/es/library/empty-state/): Un marcador centrado para listas y búsquedas vacías.
