# Interruptor

> Un interruptor para ajustes que se aplican al momento. 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/switch/

:::tip[En pocas palabras]
Un interruptor de encendido y apagado, como el de la luz, para ajustes que cambian al momento.
:::

Un interruptor de encendido y apagado con el color de acento del tema. `on_toggle` recibe el nuevo `bool`.

`ui.switch` · Categoría: [Formularios](https://albakore.github.io/pyzed/es/library/#formularios) · [Referencia completa →](https://albakore.github.io/pyzed/es/reference/ui/#switch)

**Código:**

```python
pz.column([
    ui.switch(True, on_toggle, label="Autosave"),
    ui.switch(False, on_toggle, label="Vim mode"),
], spacing=12)
```

## Cuándo usarlo

- Para ajustes que se aplican en el acto (Wi-Fi, autoguardado, modo oscuro).
- Ponlo a la derecha de un [Campo de formulario](https://albakore.github.io/pyzed/es/library/field/) para hacer pantallas de ajustes.

## Uso

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

class Settings(pz.App):
    def __init__(self):
        self.autosave = True

    def view(self):
        return ui.switch(self.autosave, lambda on: setattr(self, "autosave", on), label="Autosave")
```

## 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.
:::

### Estado

```python
ui.switch(True, on_toggle, label="Autosave")
```

```python
ui.switch(False, on_toggle, label="Autosave")
```

```python
ui.switch(True, label="Sync (managed)")
```

```python
ui.switch(True, on_toggle)
```

### Estados y eventos

```python
ui.switch(True, on_toggle, label="Locked", disabled=True)
```

```python
ui.switch(True, on_toggle, label="Small", size="sm")
```

```python
ui.switch(True, on_toggle, label="Large", size="lg")
```

### Widget base

El widget `pz.*` de debajo: sin tema, todos los colores y tamaños son tuyos.

```python
pz.toggler(True, "pz.toggler", on_toggle=on_toggle, accent="#a1c181", size=22)
```

## Eventos

Interruptor tiene **1 evento 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](https://albakore.github.io/pyzed/es/guides/events/) y [Eventos de cada componente](https://albakore.github.io/pyzed/es/library/events/).

| Evento | De | El handler recibe | Cuándo |
| --- | --- | --- | --- |
| `on_toggle` | `ui.switch`, `pz.toggler` | `(checked)` | Callable que recibe el nuevo `bool` (o mensaje que se envía). |

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

### Manejar los eventos

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](https://albakore.github.io/pyzed/es/guides/code-styles/).

**Imperativo:**

```python
class Settings(pz.App):
    def __init__(self):
        self.autosave = True

    def set_autosave(self, on):          # on_toggle: the new state
        self.autosave = on

    def view(self):
        return pz.column([
            ui.switch(self.autosave, self.set_autosave, label="Autosave"),
            ui.label("Saving as you type" if self.autosave else "Save with Ctrl+S"),
        ], spacing=8)
```

**Declarativo:**

```python
from dataclasses import dataclass

@dataclass
class SetAutosave:
    on: bool

class Settings(pz.App):
    autosave = True

    def update(self, message):
        match message:
            case SetAutosave(on):
                self.autosave = on

    def view(self):
        return ui.switch(self.autosave, SetAutosave, label="Autosave")
```

**Funcional:**

```python
from dataclasses import dataclass

@dataclass(frozen=True)
class State:
    autosave: bool = True

def view(state, set_state):
    return ui.switch(state.autosave, lambda on: set_state(autosave=on), label="Autosave")
```

## Consejos

:::tip
Al pulsarlo o llegar con Tab tiene el foco del teclado (un anillo aparece al usar las teclas): Espacio o Enter lo cambian.
:::

## Propiedades y API

### `ui.switch`

```python
switch(
    checked,
    on_toggle=None,
    *,
    label=None,
    size='md',
    disabled=False,
    id=None,
    theme=None,
)
```

Un interruptor encendido/apagado.

| Propiedad | Por defecto | Descripción |
| --- | --- | --- |
| `checked` | *obligatorio* | Estado actual. |
| `label` | `None` | Texto de la etiqueta. |
| `size` | `"md"` | `"sm"`, `"md"` o `"lg"`. |
| `disabled` | `False` | Lo atenúa e ignora los clics. |
| `id` | `None` | Identificador estable para enfocarlo o desplazarlo con un `Command`. |
| `theme` | `None` | Tema a usar en lugar del actual (`pyzed.theme.current()`). |

Eventos: `on_toggle` ([eventos](#eventos)).

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

### `pz.toggler`

```python
toggler(
    checked,
    label=None,
    *,
    on_toggle=None,
    size=None,
    text_size=None,
    accent=None,
    bg=None,
    border_color=None,
    knob_color=None,
    color=None,
)
```

Un interruptor encendido/apagado.

| Propiedad | Por defecto | Descripción |
| --- | --- | --- |
| `checked` | *obligatorio* | Estado actual. |
| `label` | `None` | Texto de la etiqueta. |
| `size` | `None` | Alto del interruptor. |
| `text_size` | `None` | Tamaño del texto. |
| `accent` | `None` | Color de acento (parte activa). |
| `bg` | `None` | Color de fondo (`"#rrggbb[aa]"`, `(r, g, b[, a])` o `"transparent"`). |
| `border_color` | `None` | Color del borde. |
| `knob_color` | `None` | Color del tirador. |
| `color` | `None` | Color del texto o del icono. |

Eventos: `on_toggle` ([eventos](#eventos)).

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

## Relacionados

- [Casilla](https://albakore.github.io/pyzed/es/library/checkbox/): Una casilla de verificación con etiqueta opcional.
- [Campo de formulario](https://albakore.github.io/pyzed/es/library/field/): Una fila de ajustes: título y descripción a la izquierda, control a la derecha.
- [Grupo de ajustes](https://albakore.github.io/pyzed/es/library/settings-group/): Un bloque con título de filas de ajustes, para pantallas de ajustes.
