Ir al contenido

Teclado y atajos

Define on_key(self, combo) en tu app para recibir todas las teclas pulsadas, como un keymap global. combo es un texto como ctrl-shift-p (el mismo formato que usan los keymaps de Zed):

Tecla combo
Ctrl+Shift+P "ctrl-shift-p"
Cmd+S (macOS) / Win+S "cmd-s"
Alt+Z "alt-z"
Esc "escape"
Flechas "up", "down", "left", "right"
Otras "enter", "tab", "space", "backspace", "delete", "home", "end", "pageup", "pagedown", "f1"…

Los modificadores van siempre en este orden: ctrl-, alt-, shift-, cmd-. Las letras llegan en minúscula.

KEYMAP = {
"ctrl-shift-p": "abrir_paleta",
"ctrl-p": "abrir_archivos",
"ctrl-b": "toggle_left",
"ctrl-s": "guardar",
}
class App(pz.App):
def on_key(self, combo):
# admite Cmd en macOS y Ctrl en el resto con la misma tabla
accion = KEYMAP.get(combo.replace("cmd-", "ctrl-"))
if accion:
return getattr(self, accion)()

on_key puede devolver lo mismo que un callback: None, un Command o un mensaje para update.

on_key se llama una vez por pulsación. Para teclas que actúan mientras se mantienen, define on_key_up(self, key), que recibe cada tecla al soltarla por su nombre ("left", "space", "a", sin modificadores), o pregunta en cualquier momento qué teclas están pulsadas:

  • pz.pressed() devuelve las teclas pulsadas ahora mismo como un frozenset de nombres.
  • pz.is_pressed("left", "a") es True mientras se mantenga cualquiera de ellas.
class Juego(pz.App):
def on_key_up(self, key):
if key == "space":
self.cargando = False
def tick(self, dt):
if pz.is_pressed("left", "a"):
self.x -= 200 * dt

Las pulsaciones y las teclas soltadas solo se convierten en mensajes cuando la app o alguna de sus ventanas define on_key u on_key_up, así que una app sin ellos no se redibuja con cada tecla. pz.pressed() funciona en ambos casos. La sección de juegos los muestra en un bucle de fotogramas, junto con ayudas de pyzed.game como axis y vector.

  • ui.kbd("ctrl-shift-p") dibuja las teclas. En macOS usa símbolos (⌃⇧P) y en el resto palabras.
  • ui.button(..., keys="ctrl-s"), ui.icon_button(..., tooltip="Guardar", keys="ctrl-s"), ui.MenuItem(..., keys=...), ui.PaletteItem(..., keys=...) y ui.tooltip(..., keys=...) muestran el atajo junto a la acción, dibujado como teclas. Pasa keys= en vez de escribir las teclas en el texto: f"Guardar ({keys})" queda desfasado cuando el usuario cambia el atajo.
  • ui.keys_text("ctrl-shift-p") da "Ctrl+Shift+P" para una etiqueta o línea de estado en texto plano.
  • Fija el estilo con pyzed.ui.base.KEY_STYLE = "symbols" o "words".