Grabar capturas y clips
pyzed record graba tu app sin pantalla: no hace falta ventana, monitor ni GPU. El puntero, el teclado
y el reloj son simulados, así que los estados al pasar el ratón y al pulsar, los tooltips, lo que se escribe y
las animaciones salen como en una ventana, y un clip sale igual en cualquier máquina. Todas las imágenes y
animaciones de esta documentación se hacen así.
Una captura o un clip
Sección titulada «Una captura o un clip»uv run pyzed record shot app.py -o app.png --size 800x600uv run pyzed record clip app.py --steps "hover('Save'); press(); wait(600)" -f webp,gif,mp4pyzed record shot app.py -o app.png --size 800x600pyzed record clip app.py --steps "hover('Save'); press(); wait(600)" -f webp,gif,mp4python3 -m pyzed.recording shot app.py -o app.png --size 800x600python3 -m pyzed.recording clip app.py --steps "hover('Save'); press(); wait(600)" -f webp,gif,mp4py -m pyzed.recording shot app.py -o app.png --size 800x600py -m pyzed.recording clip app.py --steps "hover('Save'); press(); wait(600)" -f webp,gif,mp4Qué grabar (el objetivo):
app.pyoapp.py:MiApp: unapz.Appde un archivo (sin nombre, laappdel archivo o la última App que define).paquete.modulo:MiApp: lo mismo, desde un módulo importable.login.pzform/tarjeta.pzcomp: un formulario o componente hecho con el diseñador.code:ui.button('Save', None): un fragmento cuya última línea es el widget.
Las opciones separadas por comas graban todas las combinaciones: --theme "Pyzed Dark,Pyzed Light" --scale 1,2
hace cuatro archivos, llamados app.pyzed-dark.1x.png, app.pyzed-dark.2x.png… (-o acepta {name},
{variant}, {theme}, {size}, {scale}, {fps} y {ext}).
| Opción | |
|---|---|
-f, --formats |
webp (animado), png (una imagen fija), gif, apng, mp4, webm (los dos últimos necesitan ffmpeg) |
--size, --scale, --theme, --fps |
el lienzo en píxeles lógicos, píxeles por píxel lógico, temas, fotogramas por segundo |
--steps, --duration |
lo que pasa (abajo) y los milisegundos que se graban después |
--crop |
recorta el clip a lo dibujado, más --margin píxeles |
--max-bytes, --max-width |
baja la calidad hasta que cada archivo quepa, reduce los clips anchos |
--poster |
escribe también el primer fotograma como .still.webp (para «reducir movimiento») |
--renderer |
auto, gpu o cpu (ver Velocidad) |
Los pasos mueven el puntero y el teclado mientras se graban los fotogramas, uno por línea o separados por ;:
hover("Save") # va hasta el texto "Save" y se quedapress() # un clic donde está el puntero (o press("Save"))drag("@0.2,0.5", "@0.8,0.5") # puntos relativos a lo dibujadotype_text("Ada", cps=12) # escribe en el campo con el focokey("Enter") # o key("s", "ctrl")scroll(3) # la rueda, tres líneas hacia abajowait(600) # pasa el tiempo: animaciones y spinners se muevenleave() # el puntero se vatheme("Pyzed Light") # cambia de tema en mitad del clipUn objetivo es un texto en pantalla ("Save"; "1#1" es el segundo texto "1", en orden de lectura), un
punto (x, y), "@0.25,0.5" (relativo a lo dibujado), "input" / "input:1", "center", o ("Save", 0, 30)
para apuntar al lado de un texto. Solo se admiten estos pasos y valores simples, así que un archivo de trabajos
nunca ejecuta otro código.
Muchas a la vez: archivos de trabajos
Sección titulada «Muchas a la vez: archivos de trabajos»Un archivo de trabajos lista grabaciones en TOML (o JSON). Las listas de un trabajo graban todas las
combinaciones, y formats escribe una misma grabación en varios formatos:
out_dir = "media" # junto a este archivo
[defaults]theme = ["Pyzed Dark", "Pyzed Light"]formats = ["webp", "png"]
[[job]]name = "counter"target = "../counter.py"steps = """hover('1#1')press()wait(500)"""
[[job]]name = "login"target = "../designer/login.pzform"size = "640x420"scale = [1, 2]formats = ["png"]uv run pyzed record batch examples/recording/jobs.toml # todos los trabajosuv run pyzed record batch examples/recording/jobs.toml counter # solo algunosuv run pyzed record batch examples/recording/jobs.toml --dry-run # lista lo que escribiríapyzed record batch examples/recording/jobs.toml # todos los trabajospyzed record batch examples/recording/jobs.toml counter # solo algunospyzed record batch examples/recording/jobs.toml --dry-run # lista lo que escribiríapython3 -m pyzed.recording batch examples/recording/jobs.toml # todos los trabajospython3 -m pyzed.recording batch examples/recording/jobs.toml counter # solo algunospython3 -m pyzed.recording batch examples/recording/jobs.toml --dry-run # lista lo que escribiríapy -m pyzed.recording batch examples/recording/jobs.toml # todos los trabajospy -m pyzed.recording batch examples/recording/jobs.toml counter # solo algunospy -m pyzed.recording batch examples/recording/jobs.toml --dry-run # lista lo que escribiríaEl lote usa un proceso por núcleo (--jobs N para elegir) y se salta lo que no cambió: una caché en
out_dir recuerda los ajustes y el archivo de cada resultado. --force lo graba todo de nuevo (úsalo
cuando cambió un módulo que importa la app). Un trabajo que falla se informa y el resto sigue; --json
imprime una línea por grabación para otras herramientas.
La lista completa de ajustes está en el docstring de pyzed.recording.batch, y
examples/recording/jobs.toml
es un ejemplo completo.
La ventana del grabador
Sección titulada «La ventana del grabador»uv run pyzed record gui examples/recording/jobs.tomlpyzed record gui examples/recording/jobs.tomlpython3 -m pyzed.recording gui examples/recording/jobs.tomlpy -m pyzed.recording gui examples/recording/jobs.toml
Los trabajos están a la izquierda, los ajustes del trabajo elegido en el centro (temas y formatos se activan con un clic), y la vista previa y la cola a la derecha. Preview graba una vez el trabajo elegido; Record all ejecuta el lote en otros procesos, así que la ventana sigue respondiendo y Stop lo detiene. Un clic en una grabación terminada la muestra. Save escribe el archivo de trabajos que lee la línea de comandos.
Desde Python
Sección titulada «Desde Python»from pyzed import recording as rec
take = rec.record(MiApp, [rec.hover("Save"), rec.press(), rec.wait(600)], size=(480, 270), fps=20)rec.encode(take.images(), "save.webp", "webp", fps=take.fps, target=200_000)rec.screenshot(MiApp, size=(800, 600)).save("app.png")take.images(pointer=False) deja fuera el puntero, y rec.crop_box(...) encuentra lo dibujado.
Velocidad
Sección titulada «Velocidad»- Cada proceso conserva su renderer (un dispositivo de GPU y sus pipelines) entre grabaciones, así que un lote lo paga una sola vez. Cada fotograma construye la vista dos veces, no tres, y llega al codificador como píxeles, sin un PNG de por medio.
- El WebP se codifica con esfuerzo 4: el esfuerzo 6 tarda diez veces más para archivos un 2 % más
pequeños. La calidad que cabe en
max_bytesse busca por bisección, en tres o cuatro intentos. --renderer autodibuja con la GPU si la hay, incluido un Vulkan por software (lavapipe), así que las grabaciones se ven igual en todas partes. En una máquina cuya GPU es por software (pyzed record infolo dice),--renderer cpues de dos a tres veces más rápido para borradores, pero el desenfoque, el brillo y el cristal salen un poco distintos ypz.shadermuestra su color de respaldo.
En una máquina de 4 núcleos con lavapipe, el clip overview de la sección de animación (120 fotogramas a
1520×720) pasó de 162 s a 26 s.