3 pontos por GN⁺ 2024-08-12 | 1 comentários | Compartilhar no WhatsApp

7 coisas que aprendi ao construir um framework TUI moderno

O terminal é rápido

  • Emuladores de terminal modernos são softwares extremamente sofisticados
  • É possível usar renderização acelerada por hardware para reduzir a cintilação da tela
  • Três truques para reduzir a cintilação:
    • não limpar a tela, e sim sobrescrevê-la
    • escrever na saída padrão de uma só vez
    • usar o protocolo Synchronized Output
  • O Textual usa 60fps por padrão para oferecer animações suaves

DictViews são surpreendentes

  • Os métodos keys() e items() dos dicts do Python retornam KeysView e ItemsView
  • É possível encontrar itens alterados com facilidade usando a diferença simétrica de um objeto ItemsView
  • No Textual, isso é usado para atualizações otimizadas quando propriedades CSS mudam

lru_cache é rápido

  • O decorador @lru_cache do módulo functools armazena em cache o valor de retorno de funções
  • No Textual, @lru_cache é usado em pequenas funções chamadas com frequência para melhorar o desempenho
  • É preciso verificar as informações do cache (cache_info()) para confirmar se o cache está sendo eficaz

Objetos imutáveis são os melhores

  • Você pode obter os benefícios de objetos imutáveis usando tuplas, NamedTuples ou dataclasses congeladas no Python
  • Usar objetos imutáveis permite escrever código sem efeitos colaterais, o que facilita testes e cache

Arte Unicode é boa

  • Diagramas com caracteres de caixa Unicode são muito úteis para documentação
  • Quando usados com uma boa docstring, ajudam bastante

Frações são exatas

  • O módulo fractions do Python evita erros de ponto flutuante
  • No Textual, frações são usadas para dividir a tela por proporção e implementar layouts precisos

Emojis são terríveis

  • O suporte a emojis no terminal é imprevisível e complexo
  • Usa-se o banco de dados Unicode para verificar a largura dos emojis, mas emojis mais novos podem causar resultados imprevisíveis
  • Emojis com múltiplos code points causam problemas ainda maiores

Resumo do GN⁺

  • Este texto oferece dicas e truques úteis para o desenvolvimento de aplicações de terminal em Python
  • Ele compartilha conselhos práticos obtidos com a experiência de desenvolvimento do framework Textual
  • Explica como lidar com problemas complexos, como emojis, ajudando desenvolvedores
  • Projetos com funcionalidades semelhantes incluem urwid e prompt_toolkit

1 comentários

 
GN⁺ 2024-08-12
Comentários do Hacker News
  • Quem desenvolve TUI acaba tratando Unicode, caracteres internacionais e emojis como um projeto à parte

    • Enfrentei o mesmo problema com os pacotes rivo/tview e rivo/uniseg
    • Cada mantenedor de biblioteca TUI desenvolve sua própria solução
    • A largura dos caracteres não é padronizada, o que torna os terminais complexos
    • O OP só oferece suporte a Unicode 9 (a versão atual do Unicode é 15.1)
    • No fim, os usuários vão reclamar que certos emojis ou caracteres internacionais não são renderizados corretamente
  • Incomoda que o Textual tente imitar o React

    • React é um framework popular, mas não é uma boa forma de construir interfaces de usuário
    • Design responsivo básico é algo já bem conhecido
    • Usar CSS parece exagero
    • O modelo do React já quebra bastante os conceitos de CSS
    • Se desse para não usar CSS, tudo bem
  • Pela minha experiência usando o Textual, é preciso usar CSS

    • Não há bons componentes padrão, então é preciso criar os seus
    • Ele usa folhas de estilo externas em vez de classes Python
    • Por esses motivos, o Textual ainda não serve para mim
    • Em Python, deveria haver uma maneira óbvia de fazer isso
    • Ele imita o React de perto demais e acaba refletindo os pontos fracos da comunidade JavaScript
  • Essa TUI é bonita, mas não consigo imaginar uma situação real para usá-la

    • Ou eu me contento com funcionalidade mínima, ou vou direto para uma GUI
    • O link do YouTube mostra uma tabela com destaque de células
    • Não entendo por que isso seria necessário em uma TUI
    • No fim, você vai precisar de uma GUI de verdade
  • O kitty oferece mais recursos

  • Não entendo por que engenheiros de software se interessam tanto por TUI

    • Gosto de bons programas de linha de comando, mas TUI não me atrai
  • O Monodraw é exclusivo do macOS, mas há boas alternativas em outras plataformas

  • "Sobrescrever, não apagar" era a forma antiga de desenvolver jogos

    • Antes do DirectX, escrevíamos direto no frame buffer e redesenhávamos só as partes alteradas
  • Há uma forma de estimar a versão do Unicode verificando a posição do cursor no terminal

    • O terminal renderiza emojis de forma imprevisível
    • Dá para usar esse método sempre que for preciso determinar a largura de uma string
    • Já usei esse método por irritação com wcwidth
  • Depois de avaliar várias bibliotecas TUI, a FTXUI foi a mais fácil de usar e a mais confiável

    • FTXUI
    • Útil para criar dashboards interativos com suporte a teclado e mouse