3 points par GN⁺ 2024-08-12 | 1 commentaires | Partager sur WhatsApp

7 choses apprises en construisant un framework TUI moderne

Les terminaux sont rapides

  • Les émulateurs de terminal modernes sont des logiciels très sophistiqués
  • Le rendu accéléré par le matériel permet de réduire le scintillement de l’écran
  • Trois astuces pour réduire le scintillement :
    • ne pas effacer l’écran, mais réécrire par-dessus
    • écrire en une seule fois sur la sortie standard
    • utiliser le protocole Synchronized Output
  • Textual utilise 60 fps par défaut pour offrir des animations fluides

Les DictViews sont surprenantes

  • Les méthodes keys() et items() des dict Python renvoient respectivement KeysView et ItemsView
  • La différence symétrique d’un objet ItemsView permet de repérer facilement les éléments modifiés
  • Dans Textual, cela est utilisé pour des mises à jour optimisées lorsque les propriétés CSS changent

lru_cache est rapide

  • Le décorateur @lru_cache du module functools met en cache les valeurs de retour d’une fonction
  • Dans Textual, @lru_cache est utilisé sur de petites fonctions appelées fréquemment pour améliorer les performances
  • Il faut vérifier les informations du cache (cache_info()) pour confirmer que le caching est efficace

Les objets immuables, c’est le mieux

  • Les tuples, NamedTuple ou les dataclass figées de Python permettent de profiter des avantages des objets immuables
  • Les objets immuables permettent d’écrire du code sans effets de bord, ce qui facilite les tests et le caching

L’art Unicode est utile

  • Les diagrammes utilisant les caractères de boîte Unicode sont très utiles pour la documentation
  • Utilisés avec des docstrings bien rédigées, ils apportent une grande aide

Les fractions sont précises

  • Le module fractions de Python permet d’éviter les erreurs de virgule flottante
  • Dans Textual, les fractions sont utilisées pour diviser l’écran selon des proportions et obtenir une mise en page précise

Les emojis sont terribles

  • La prise en charge des emojis dans les terminaux est imprévisible et complexe
  • La base de données Unicode permet de vérifier la largeur des emojis, mais les emojis récents peuvent produire des résultats imprévisibles
  • Les emojis multi-codepoints posent des problèmes encore plus importants

Résumé de GN⁺

  • Cet article propose des astuces et techniques utiles pour développer des applications de terminal en Python
  • Il partage des conseils pratiques issus de l’expérience de développement du framework Textual
  • Il explique comment aborder des problèmes complexes comme les emojis, ce qui peut aider les développeurs
  • Parmi les projets aux fonctionnalités similaires, on trouve urwid et prompt_toolkit

1 commentaires

 
GN⁺ 2024-08-12
Avis sur Hacker News
  • Les développeurs de TUI finissent par traiter Unicode, les caractères internationaux et les emojis comme un projet à part entière

    • Les paquets rivo/tview et rivo/uniseg ont rencontré le même problème
    • Chaque mainteneur de bibliothèque TUI a développé sa propre solution
    • La largeur des caractères n’est pas normalisée, ce qui complique les terminaux
    • L’auteur original ne prend en charge qu’Unicode 9 (la version actuelle est Unicode 15.1)
    • Au final, les utilisateurs se plaindront que certains emojis ou caractères internationaux ne s’affichent pas correctement
  • Le fait que Textual essaie d’imiter React pose problème

    • React est un framework populaire, mais ce n’est pas une bonne manière de construire des interfaces utilisateur
    • Le design réactif de base est une méthode bien connue
    • Utiliser du CSS semble excessif
    • Le modèle de React casse déjà beaucoup de concepts du CSS
    • Si on pouvait se passer de CSS, ce serait acceptable
  • Après avoir essayé Textual, il s’avère qu’il faut utiliser du CSS

    • Il n’y a pas de bons composants standard, donc il faut les créer soi-même
    • On utilise des feuilles de style externes plutôt que des classes Python
    • Pour ces raisons, Textual ne me convient pas encore
    • En Python, il devrait y avoir une seule manière évidente de faire les choses
    • L’imitation trop étroite de React lui fait refléter les défauts de la communauté JavaScript
  • Ce TUI est joli, mais je n’arrive pas à imaginer dans quel cas l’utiliser réellement

    • Soit on se contente de fonctionnalités minimales, soit on passe directement à une GUI
    • Le lien YouTube montre un tableau avec mise en évidence des cellules
    • Je ne comprends pas pourquoi ce serait nécessaire dans un TUI
    • Au final, il faudra une vraie GUI
  • kitty offre davantage de fonctionnalités

  • Je ne comprends pas pourquoi les ingénieurs logiciel s’intéressent autant aux TUI

    • J’aime les bons programmes en ligne de commande, mais les TUI ne m’attirent pas
  • Monodraw est réservé à macOS, mais il existe de bonnes alternatives sur d’autres plateformes

  • « Écraser, ne pas effacer » est une ancienne méthode de développement de jeux

    • Avant DirectX, on écrivait directement dans le frame buffer et on ne redessinait que les parties modifiées
  • Il existe une méthode pour estimer la version d’Unicode en vérifiant la position du curseur dans le terminal

    • Le terminal rend les emojis de manière imprévisible
    • On peut utiliser cette méthode chaque fois qu’il faut déterminer la largeur d’une chaîne
    • Je l’ai déjà utilisée parce que wcwidth me tapait sur les nerfs
  • Après avoir évalué plusieurs bibliothèques TUI, FTXUI s’est révélée la plus simple à utiliser et la plus fiable

    • FTXUI
    • Utile pour créer des tableaux de bord interactifs avec prise en charge du clavier et de la souris