3 puntos por GN⁺ 2024-08-12 | 1 comentarios | Compartir por WhatsApp

7 cosas que aprendí al construir un framework TUI moderno

La terminal es rápida

  • Los emuladores de terminal modernos son software muy sofisticado
  • Se puede usar renderizado acelerado por hardware para reducir el parpadeo de pantalla
  • Tres trucos para reducir el parpadeo:
    • no limpiar la pantalla, sino sobrescribirla
    • escribir a la salida estándar de una sola vez
    • usar el protocolo Synchronized Output
  • Textual usa 60fps por defecto para ofrecer animaciones fluidas

DictViews son una sorpresa

  • Los métodos keys() e items() de los dict de Python devuelven KeysView e ItemsView
  • Usar la diferencia simétrica de un objeto ItemsView permite encontrar fácilmente los elementos modificados
  • En Textual se usa cuando cambian propiedades de CSS para actualizaciones optimizadas

lru_cache es rápido

  • El decorador @lru_cache del módulo functools almacena en caché el valor de retorno de una función
  • En Textual se mejora el rendimiento usando @lru_cache en funciones pequeñas que se llaman con frecuencia
  • Hay que revisar la información de caché (cache_info()) para comprobar si el almacenamiento en caché está siendo efectivo

Los objetos inmutables son lo mejor

  • Puedes obtener las ventajas de los objetos inmutables usando tuplas, NamedTuple o dataclass congeladas en Python
  • Usar objetos inmutables permite escribir código sin efectos secundarios, lo que facilita las pruebas y el almacenamiento en caché

El arte Unicode es bueno

  • Los diagramas con caracteres de caja Unicode son muy útiles para la documentación
  • Combinados con un buen docstring, ayudan muchísimo

Las fracciones son exactas

  • El módulo fractions de Python permite evitar errores de punto flotante
  • En Textual se usan fracciones para dividir la pantalla según proporciones e implementar layouts precisos

Los emojis son terribles

  • El soporte de emojis en la terminal es impredecible y complejo
  • Se usa la base de datos Unicode para verificar el ancho de los emojis, pero los emojis más nuevos pueden provocar resultados impredecibles
  • Los emojis de múltiples code points causan problemas aún mayores

Resumen de GN⁺

  • Este artículo ofrece tips y trucos útiles para desarrollar aplicaciones de terminal en Python
  • Comparte consejos prácticos obtenidos a partir de la experiencia de desarrollo del framework Textual
  • Explica cómo manejar problemas complejos como los emojis para ayudar a otros desarrolladores
  • Proyectos con funciones similares incluyen urwid y prompt_toolkit

1 comentarios

 
GN⁺ 2024-08-12
Comentarios de Hacker News
  • Los desarrolladores de TUI terminan tratando Unicode, caracteres internacionales y emojis como un proyecto aparte

    • Tuve el mismo problema con los paquetes rivo/tview y rivo/uniseg
    • Cada mantenedor de bibliotecas TUI desarrolló su propia solución
    • Los terminales son complejos porque el ancho de los caracteres no está estandarizado
    • El OP solo soporta Unicode 9 (la versión actual de Unicode es la 15.1)
    • Al final, los usuarios se van a quejar de que ciertos emojis o caracteres internacionales no se renderizan bien
  • Me molesta que Textual intente imitar a React

    • React es un framework popular, pero no es una buena forma de construir interfaces de usuario
    • El diseño responsivo básico ya es un método bien conocido
    • Usar CSS parece excesivo
    • El modelo de React ya rompe muchos conceptos de CSS
    • Si se pudiera no usar CSS, estaría bien
  • Después de probar Textual, resulta que sí hay que usar CSS

    • No hay buenos componentes estándar, así que hay que hacerlos uno mismo
    • Usa hojas de estilo externas en vez de clases de Python
    • Por esas razones, Textual todavía no es para mí
    • En Python debería haber una sola forma clara de hacerlo
    • Imita demasiado de cerca a React y refleja las desventajas de la comunidad JavaScript
  • Este TUI se ve bonito, pero no se me ocurre en qué situación realmente lo usaría

    • Me conformo con funcionalidad mínima o de una vez uso una GUI
    • En el enlace de YouTube muestran una tabla donde se pueden resaltar celdas
    • No entiendo por qué eso sería necesario en un TUI
    • Al final se va a necesitar una GUI de verdad
  • kitty ofrece más funciones

  • No entiendo por qué a los ingenieros de software les interesan tanto los TUI

    • Me gustan los buenos programas de línea de comandos, pero los TUI no me atraen
  • Monodraw es solo para MacOS, pero hay buenas alternativas en otras plataformas

  • "Sobrescribir, no borrar" era la forma en que se desarrollaban los juegos antes

    • Antes de DirectX, se escribía directamente en el frame buffer y solo se redibujaban las partes que cambiaban
  • Hay una forma de estimar la versión de Unicode consultando la posición del cursor en la terminal

    • La terminal renderiza los emojis de una forma que no se puede predecir
    • Se puede usar este método cada vez que haya que determinar el ancho de una cadena
    • Me harté de wcwidth y he usado este método
  • Después de evaluar varias bibliotecas TUI, FTXUI fue la más fácil de usar y la más confiable

    • FTXUI
    • Es útil para crear dashboards interactivos con soporte de teclado y mouse