# Iconos y metadatos

> Dale a una app Pyzed empaquetada su nombre, icono (.ico, .icns y el icono de la ventana a partir de un PNG), versión, editor, identificador de paquete y propiedades del archivo en Windows, macOS y Linux.

Source: https://albakore.github.io/pyzed/es/packaging/icons-metadata/

La identidad de una app son unas pocas cosas: su **nombre**, su **icono**, su **versión**, quién la **publica** y, en
macOS, su **identificador de paquete**. Todas se fijan en `[tool.pyzed.build]` de `pyproject.toml`, a mano o desde el
[diálogo Exportar](https://albakore.github.io/pyzed/es/editor/exporting/#general) de Pyzed Design, y `pyzed build` las escribe donde las busca
cada sistema.

## Nombre, versión y datos

```toml title="pyproject.toml"
[tool.pyzed.build]
name = "Shop"                   # Shop.exe, Shop.app, dist/Shop/
version = "1.2.0"               # por defecto: la versión de [project]
publisher = "Acme"
identifier = "com.acme.shop"    # por defecto: com.<editor>.<nombre>
description = "Punto de venta"  # por defecto: la descripción de [project]
copyright = "© 2026 Acme"
```

| Qué | Windows | macOS | Linux |
| --- | --- | --- | --- |
| `name` | `Shop.exe`, el nombre del producto | `Shop.app`, `CFBundleDisplayName` | El ejecutable |
| `version` | Versión del archivo y del producto (pestaña Detalles) | `CFBundleShortVersionString` y `CFBundleVersion` | - |
| `publisher` | Nombre de la empresa | - | - |
| `identifier` | - | `CFBundleIdentifier` | El id de la app de sus ventanas (mira [El icono de la ventana](#el-icono-de-la-ventana)) |
| `description` | Descripción del archivo | - | - |
| `copyright` | Copyright legal | `NSHumanReadableCopyright` | - |

Con PyInstaller, `pyzed build` escribe un archivo de versión de Windows (`build/pyzed/version.txt`) y completa el
`Info.plist` del paquete tras compilar; Nuitka recibe los mismos valores como opciones.

Usa como `identifier` un dominio invertido que te pertenezca. macOS guarda las preferencias y los permisos de
privacidad de la app con él, así que no lo cambies entre versiones.

El **título de la ventana** no va aquí: es el **Título** del formulario en el diseñador, o `title` de tu `pz.App`.

Si tu app muestra su versión o [busca actualizaciones](https://albakore.github.io/pyzed/es/packaging/updates/), guarda también la versión en tu
código, por ejemplo en el `__init__.py` de tu paquete, y actualízala junto con `pyproject.toml`:

```python title="src/shop/__init__.py"
__version__ = "1.2.0"
```

**¿Por qué no importlib.metadata?:**

`importlib.metadata.version("shop")` lee los metadatos del paquete instalado, que PyInstaller no copia al paquete
salvo que se lo pidas (`args = ["--copy-metadata", "shop"]`). Una constante en tu código siempre funciona.

## El icono

Dale a `icon` una imagen cuadrada, idealmente un PNG de 1024 × 1024 píxeles con fondo transparente:

```toml title="pyproject.toml"
[tool.pyzed.build]
icon = "assets/icon.png"
```

`pyzed build` crea a partir de ella todos los archivos que piden los sistemas, con el código de imagen del propio
Pyzed (sin Pillow, `sips` ni `iconutil`), en `build/pyzed/`:

| Archivo | Tamaños dentro | Para |
| --- | --- | --- |
| `app-icon.ico` | 16, 20, 24, 32, 40, 48, 64, 128, 256 px | El `.exe` de Windows: el Explorador, la barra de tareas, Alt+Tab |
| `app-icon.icns` | de 16 a 1024 px, con tamaños Retina | El paquete de macOS: el Finder y el Dock |
| `app-icon.png` | 256 px | El icono de las ventanas de la app (va dentro de la app) |

Los tamaños pequeños salen de reducir la imagen grande. Si las versiones de 16 y 32 píxeles se ven borrosas, dibuja tú
una versión más simple para ellas (abajo) o usa un diseño con trazos gruesos. El
[diálogo Exportar](https://albakore.github.io/pyzed/es/editor/exporting/#icono) muestra una vista previa de cada tamaño.

Un archivo `.ico` o `.icns` dado como `icon` se usa tal cual, para su sistema.

### Crear tú los archivos de icono

Para controlar cada tamaño, crea los archivos con tu herramienta favorita a partir de un PNG de 1024 × 1024:

**Windows .ico (Python):**

```python
from PIL import Image  # pip install pillow

Image.open("icon.png").save("icon.ico", sizes=[(s, s) for s in (16, 24, 32, 48, 64, 128, 256)])
```

**macOS .icns:**

```bash
mkdir icon.iconset
for s in 16 32 128 256 512; do
  sips -z $s $s icon.png --out icon.iconset/icon_${s}x${s}.png
  sips -z $((s*2)) $((s*2)) icon.png --out icon.iconset/icon_${s}x${s}@2x.png
done
iconutil -c icns icon.iconset   # escribe icon.icns (solo macOS)
```

## El icono de la ventana

Los iconos del `.exe` y de la `.app` son los del **archivo**. Una app empaquetada también da el icono a sus
**ventanas** (la barra de título y la barra de tareas en Windows y Linux): el lanzador fija `pz.Window.icon` a
`app-icon.png`. macOS siempre muestra en el Dock el icono del paquete.

En tu propio código, cualquier ventana puede tener su icono, una ruta a una imagen o sus bytes:

```python
import pyzed as pz

class Shop(pz.App):
    icon = "assets/icon.png"
    app_id = "com.acme.shop"   # Linux: coincide con el archivo .desktop
```

En Linux, `app_id` da nombre a la app ante el escritorio. Wayland toma el icono de la barra de tareas y del dock del
archivo `.desktop` cuyo nombre coincide (`com.acme.shop.desktop`, mira
[Linux](https://albakore.github.io/pyzed/es/packaging/linux/#añadirla-al-menú-de-aplicaciones)); X11 usa `icon` directamente.

## Propiedades del archivo en Windows a mano

Para usar tu propio recurso de versión en lugar del generado (más campos, otros idiomas), captura uno de un `.exe`
existente con `pyi-grab_version` y pásaselo a PyInstaller:

```toml title="pyproject.toml"
[tool.pyzed.build.pyinstaller]
args = ["--version-file", "assets/version.txt"]
```

Las rutas de `args` llegan a PyInstaller sin cambios, y PyInstaller escribe su archivo spec en `build/pyzed/`: si no
encuentra el archivo, usa su ruta absoluta.
