GTK+ e Python: Desenvolvimento Gráfico e UI

 

Algumas referências de estudo e resumo com NotebookLM. No final alguns links. Atualmente estou pesquisando e estudando as bibliotecas Cairo e Gtk+ e seu usos na criação de interfaces e aplicações gráficas para o projeto que tenho planejado. Logo espero poder estar compartilhando.

 Segue um resumo detalhado dos temas e ideias mais importantes extraídos das fontes fornecidas:

 

Youtube vídeo

 

Briefing: Ferramentas e Bibliotecas para Desenvolvimento Gráfico e de Aplicações com Python e GTK+

Este briefing abrange as principais funcionalidades e relações entre Cairo, Pango, GObject, GDK, GLib e as bindings Python Pycairo e PyGObject, focando no desenvolvimento de aplicações gráficas.

1. Cairo: Biblioteca Gráfica Vetorial

Cairo é uma biblioteca de gráficos vetoriais que oferece primitivas de desenho 2D. É fundamental para renderização em diversas superfícies e suporta uma variedade de formatos de saída e fontes.

  • Contexto de Desenho (cairo_t): O coração da biblioteca, usado para todas as operações de desenho.
  • Caminhos (Paths): Permite a criação e manipulação de formas geométricas.
  • Fontes para Desenho (cairo_pattern_t): Define as fontes de cor, gradientes e texturas para as operações de desenho.
  • Transformações: Capacidade de manipular a matriz de transformação atual para operações como translação, escala e rotação.
  • Renderização de Texto e Glyphs: Suporte para exibição de texto e caracteres.
  • Fontes (Fonts):
  • Fornece classes base para faces de fonte (cairo_font_face_t), fontes em tamanhos e opções específicas (cairo_scaled_font_t), e opções de renderização de fonte (cairo_font_options_t).
  • Suporte a diversas tecnologias de fontes: FreeType, Win32 GDI, Microsoft DirectWrite (DWrite), Core Text (Quartz/CGFont) em sistemas Apple, e fontes fornecidas pelo usuário.
  • Superfícies (Surfaces): Representam o destino da renderização.
  • Tipos de Superfícies: Imagem (para buffers de memória), PDF, PostScript, SVG, Quartz, Win32, XCB, XLib, XLib-XRender.
  • Recursos Avançados: Superfícies de Gravação (registram operações de desenho), Observador de Superfície (observa outras superfícies), Superfície Tee (redireciona entrada para múltiplas superfícies) e Superfícies de Script (para scripts reproduzíveis).
  • Manipulação de Imagens: Suporte para leitura e escrita de imagens PNG.
  • Gerenciamento de Erros e Versão: Ferramentas para decodificação de status de erro e verificação de informações de versão.

2. Pango: Biblioteca para Layout e Renderização de Texto Internacionalizado

Pango é uma biblioteca para lidar com texto internacionalizado, fornecendo funcionalidade para layout e renderização de texto, frequentemente usada em conjunto com Cairo para exibir texto renderizado.

  • Extração de Extensões de Glyph: Macros como ASCENT, DESCENT, LBEARING, RBEARING são usadas para extrair informações dimensionais de um PangoRectangle que representa as extensões de glyphs.
  • Conversão para Unidades de Dispositivo: Macros PIXELS, PIXELS_CEIL, PIXELS_FLOOR convertem dimensões Pango para unidades de dispositivo, arredondando, arredondando para cima ou para baixo, respectivamente.
  • Glyphs Especiais: GLYPH_INVALID_INPUT e GLYPH_UNKNOWN_FLAG são valores para lidar com entrada inválida ou caracteres desconhecidos.
  • Escala (SCALE): Define a proporção entre as dimensões de distância do Pango e as unidades de dispositivo.
  • Informações de Versão: Macros para obter os componentes principal, menor e micro da versão do Pango em tempo de compilação (VERSION_MAJOR, VERSION_MINOR, VERSION_MICRO).

3. Pycairo e Pangocairocffi: Bindings Python para Cairo e PangoCairo

Pycairo e Pangocairocffi são as interfaces Python para as bibliotecas Cairo e PangoCairo, respectivamente, permitindo que desenvolvedores Python utilizem suas funcionalidades.

  • Instalação: Para Pycairo, "pip install pycairo" é o método recomendado, mas requer a instalação prévia de Cairo, incluindo seus cabeçalhos. Pangocairocffi (Release 0.7.0, Out 09, 2022) também é uma binding.
  • Exemplo de Uso Pycairo: Demonstra a criação de uma superfície SVG, um contexto Cairo, e operações de desenho como move_to, curve_to, stroke, set_source_rgba, set_line_width, e line_to.
  • import cairo
  • with cairo.SVGSurface("example.svg", 200, 200) as surface:
  • context = cairo.Context(surface)
  • # ... operações de desenho ...
  • Pangocairocffi: Fornece funcionalidades para "Criar e atualizar objetos Pango a partir de Cairo", "Renderizar objetos Pango com Cairo" e "Fontes PangoCairo".

4. GLib: Biblioteca de Baixo Nível

GLib é uma biblioteca de utilitários de baixo nível, parte essencial do ecossistema GTK+, fornecendo tipos de dados, algoritmos, utilitários de thread, gerenciamento de memória e E/S de arquivos.

  • Gerenciamento de Memória: Funções como g_malloc(), g_aligned_alloc(), g_free(), g_realloc(), e suas variantes _try_ (que retornam NULL em caso de falha em vez de abortar) e _0 (que inicializam a memória com zeros). g_memdup() para duplicação de memória.
  • "Allocates n_bytes bytes of memory. If n_bytes is 0 it returns NULL." - g_malloc()
  • Tipos de Dados e Estruturas:
  • GVariant: Tipo de dado variante que pode conter um ou mais valores com informações de tipo.
  • GUri: Tipo e funções relacionadas para analisar URIs em seus componentes e construir URIs válidos.
  • GStaticRecMutex: Semelhante a um mutex, mas pode ser bloqueado múltiplas vezes pela mesma thread, substituído por GRecMutex no GLib 2.32.
  • Operações Atômicas: Funções para operações atômicas em inteiros (g_atomic_int_add, g_atomic_int_compare_and_exchange, etc.) e ponteiros (g_atomic_pointer_add, g_atomic_pointer_compare_and_exchange, etc.), cruciais para programação concorrente.
  • Referência Atômica Contada (atomic_rc_box): Funções para alocar, adquirir e liberar blocos de memória com contagem de referência atômica.
  • Manipulação de Arquivos e Diretórios: Wrappers para funções POSIX como access(), chdir(), chmod(), mkdir(), remove(), rename(), rmdir(), stat(), fopen(), freopen(). Funções para criar diretórios temporários (mkdtemp).
  • Strings: Funções para manipulação de strings, incluindo g_strreverse, g_strrstr, g_strsplit, g_shell_quote, g_shell_unquote e conversão para valor de ponto flutuante (g_strtod).
  • Tempo: g_get_monotonic_time() para consultar o tempo monotonic do sistema.
  • Checksum: Funções para computar checksums de dados e strings.
  • UUID: g_uuid_string_random() para gerar UUIDs aleatórios (versão 4 RFC 4122) e g_uuid_string_is_valid() para validar.
  • Depuração e Asserções: Funções e macros para warnings de asserção (g_assert_warning, G_ASSERT_TRUE), e funções para serem chamadas na terminação normal do programa (g_atexit).
  • Concorrência: Macros G_LOCK_DEFINE, G_LOCK, G_UNLOCK, G_TRYLOCK fornecem uma interface conveniente para GMutex. Adicionalmente, G_AUTO_LOCK, G_REC_MUTEX_AUTO_LOCK, G_RW_LOCK_READER_AUTO_LOCK, G_RW_LOCK_WRITER_AUTO_LOCK para bloqueios automáticos com g_autoptr().
  • Verificação de Tamanho: Funções como g_size_checked_add, g_size_checked_mul para adição e multiplicação verificadas, evitando overflow.

5. GObject: Sistema de Tipos e Objetos

GObject é a base do sistema de objetos GTK+, fornecendo um sistema de tipos flexível e extensível, propriedades de objetos e um sistema de sinais.

  • Sistema de Tipos (G_TYPE_ macros): Fornece macros para verificar se um GValue pode conter valores de tipos específicos, como G_TYPE_BOOLEAN, G_TYPE_INT, G_TYPE_STRING, G_TYPE_OBJECT, G_TYPE_VARIANT, entre outros (G_VALUE_HOLDS_BOOLEAN, G_VALUE_HOLDS_INT, G_VALUE_HOLDS_STRING, etc.).
  • GValue: Um tipo de dado genérico que pode conter qualquer tipo de valor registrado no sistema de tipos GObject.
  • Herdar de GObject.GObject: A base para a criação de novos objetos com propriedades e sinais.
  • Sinais: Mecanismo para objetos emitirem notificações quando algo interessante acontece.
  • Propriedades: Permitem que os objetos tenham atributos que podem ser lidos e escritos de forma padronizada.

6. GDK: Kit de Ferramentas de Desenho GTK+

GDK é a camada de abstração entre GTK+ e o sistema de janelas subjacente (X11, Wayland, Windows GDI, macOS Quartz).

  • Tipos de Modificadores (ModifierType): Conjunto de bit-flags para indicar o estado de teclas modificadoras (Shift, Control, Alt, etc.) e botões do mouse em eventos.
  • Capacidades do Assento (SeatCapabilities): Flags que descrevem as capacidades de um assento (dispositivo de entrada lógico).
  • Tipos de Atributos de Janela (WindowAttributesType): Usado para indicar quais campos na estrutura GdkWindowAttr devem ser considerados ao criar uma nova janela.
  • Dicas de Janela (WindowHints): Usado para indicar quais campos de uma estrutura GdkGeometry devem ser considerados, como posição e tamanho. GDK_HINT_USER_POS e GDK_HINT_USER_SIZE são importantes para configurações de geometria do usuário.
  • Propriedades da Janela: Funções para alterar, deletar e recuperar conteúdo de propriedades em uma janela (property_change, property_delete, property_get).
  • Profundidades de Cor (query_depths): Retorna as profundidades de bits disponíveis para a tela padrão.
  • Teclas de Teclado: Definições extensas para códigos de teclas, incluindo caracteres gregos e coreanos (Hangul/Kana), indicando suporte a diferentes layouts de teclado e internacionalização.

7. PyGObject: Bindings Python para bibliotecas GObject

PyGObject é a binding Python oficial para bibliotecas baseadas em GObject, incluindo GTK+ 3, GDK, GLib, GIO e GStreamer.

  • Instalação: Requer GTK+3, Python (2.6+ ou 3.1+), gobject-introspection. Pacotes pré-construídos estão disponíveis para a maioria das distribuições Linux. Para suporte completo da IDE (incluindo autocompletar), é necessário o pacote PyGObject-stubs.
  • Importação e Versão: import gi e gi.require_version("Gtk", "3.0") são usados para garantir que a versão correta do GTK+ (GTK+ 3 neste caso) seja carregada.
  • Loop Principal e Sinais: O Gtk.main() inicia o loop principal do GTK+, e win.connect("destroy", Gtk.main_quit) conecta o sinal de destruição da janela para sair do loop principal.
  • Propriedades: Permite acesso e inspeção das propriedades dos widgets GTK+. Ex: print(dir(widget.props)) para listar propriedades de um Gtk.Box.
  • Strings: Explica a representação de strings em Python 2.x, 3.x e GTK+, e discute erros comuns. O padrão Unicode e pontos de código são mencionados para a representação de caracteres.
  • Widgets e Layout: O tutorial detalha uma ampla gama de widgets GTK+ 3 e contêineres de layout, como Gtk.Box, Gtk.Grid, Gtk.ListBox, Gtk.Stack, Gtk.HeaderBar, Gtk.FlowBox, Gtk.Notebook, Gtk.Label, Gtk.Entry, botões (Button, ToggleButton, CheckButton, RadioButton, LinkButton, SpinButton, Switch), Expander, ProgressBar, Spinner, widgets de árvore e lista, CellRenderers (Text, Toggle, Pixbuf, Combo, Progress, Spin), ComboBox, IconView, Multiline Text Editor, Dialogs (Custom, MessageDialog, FileChooserDialog), Popovers, Clipboard, Drag and Drop.
  • Glade e Gtk.Builder: Suporte para o uso de arquivos .glade para definir a interface do usuário, permitindo carregar, acessar widgets e conectar sinais. Gtk.Template é uma alternativa mencionada.
  • Aplicação (Gtk.Application): Suporte para ações, menus e manipulação da linha de comando em aplicações GTK+.

8. GIRepository: Introspecção de Tipos GLib/GObject

GIRepository é uma biblioteca que permite a introspecção de tipos, ou seja, obter informações sobre APIs em tempo de execução a partir de arquivos .typelib.

  • GITypelib: Representa um arquivo .typelib carregado, contendo a descrição da API de um módulo.
  • Informações de Argumentos e Tipos: Contém estruturas e enumerações para descrever argumentos (Argument), tipos de arrays (ArrayType), direção de argumentos (Direction), tipo de escopo (ScopeType) para callbacks, e como a propriedade de recursos é transferida (Transfer).
  • Tipos de Erro: RepositoryError para erros de repositório e InvokeError para erros ao invocar funções via gi_function_info_invoke().
  • Flags: Diversas flags para informações de campos (FieldInfoFlags), funções (FunctionInfoFlags), carregamento de typelib (RepositoryLoadFlags) e funções virtuais (VFuncInfoFlags).

Conclusão Geral

O conjunto de documentos descreve um ecossistema robusto para o desenvolvimento de aplicações gráficas, especialmente com foco em interfaces de usuário (UIs) e manipulação de gráficos 2D. Cairo fornece as primitivas de desenho vetorial, Pango cuida do layout e renderização de texto internacionalizado, enquanto GLib e GObject fornecem a infraestrutura de baixo nível, incluindo gerenciamento de memória, tipos de dados e um sistema de objetos extensível. GDK atua como a ponte entre o GTK+ e o sistema de janelas. As bindings Python (Pycairo, Pangocairocffi, PyGObject) tornam todo esse poder acessível aos desenvolvedores Python, permitindo a criação de UIs ricas e sofisticadas, com suporte para internacionalização e recursos avançados de sistema.

 

 

Referências

 

Libs Docs

  1. Gtk+ - https://www.gtk.org/

  2. Cairo - https://www.cairographics.org/

  3. Pango - https://www.pango.org/

  4. Numpy - https://numpy.org/

Links & Tutorials

  1. Tutorial Point PyGtk - https://www.tutorialspoint.com/pygtk/index.htm

  2. Python Gtk 3 - https://python-gtk-3-tutorial.readthedocs.io

  3. Python Cairo - https://pycairo.readthedocs.io

  4. Python Gtk API, Lazka - https://lazka.github.io/pgi-docs/Gtk-3.0/index.html

  5. Cairo, Zetcodes - https://zetcode.com/gfx/cairo/basicdrawing/

  6. GIRepository gi - https://docs.gtk.org/girepository/

  7. GLib - https://docs.gtk.org/glib/

  8. GObject - https://docs.gtk.org/gobject/

  9. Gdk - https://docs.gtk.org/gdk3/

  10. GdkPixbuf - https://docs.gtk.org/gdk-pixbuf/

  11. Pango - https://docs.gtk.org/Pango/

  12. MSys - dev builds packages in Windows - https://www.msys2.org/

     

 

Crônica Rua Aurora


Crônica de Uma Rua

O senhor Antônio estava muito cansado de seu dia de trabalho a esperar pelo carro que chamara pelo seu celular. Rindo-se pensava, “Que maravilhas desses tempos. Ótimo. Bom meu neto pacientemente ensinou-me a usar este aplicativo. Tão logo peço um carro, este chega…”.

Enquanto esperava observava as ruas cheias e movimentadas das pessoas que largavam e iam pra casa, e os boêmios, que como em seu tempo de mocidade, chegavam para aproveitar a noite. Lembrava-se logo de seu tempo com colegas e amigos em um pequeno café na Rua Aurora. Falavam sobre tudo das artes à poesia e a política. Assistiam recitais e apresentações no grande teatro Santa Isabel.

Logo a nostalgia o afagara, com seus cabelos brancos e tês marcada do tempo, observava como tanto mudaram as coisas. A cidade não tinha mais aquele ar europeu e glamouroso de outros tempos parecia desleixada e pouco ou quase nada cuidada. Via mulheres, trans e homens que negociavam sua companhia com os passantes em suas roupas coloridas e justas com toques de transparências que revelavam sem tanto mostrar suas peles, a fim de preencher o vazio da solidão de alguém.

O ar pesava da fumaça dos carros que substituíra os bondes elétricos. Assombrava-lhe como com todas modernidades e maravilhas dos tempos modernos velhos problemas persistiam. Via a criança maltrapilha que passava tão magra que suas juntas saltavam-lhe os olhos com um olhar tão desolado como aquele que pena a implorar a morte. Chocava-se como algumas coisas não mudavam pelo que lhe parecia.



De súbito sentiu Antônio um puxão a beira de sua calça. Logo virou-se e viu uma menina pálida com rosto empoeirado uma boneca gasta do tempo e das desilusões e dores da vida. Fitou-a. Ela tinha um pão pequeno a mão que pela aparência parecia ter sido apanhado do chão. Logo a lágrima caiu-lhe. Caiu como uma faca afiada que de súbito perfurando-lhe o coração rasgou-lhe em uma dor tão terrível quanto nunca pudera imaginar.



Uma mulher que estava em seu ponto de trabalho aguardando clientes, sem Antônio perceber, o observava e sorriu-se a contemplar mesmo que receosa o gesto do senhor que tomou a menina pela mão caminhou até uma pequenina barraquinha e comprou-lhe um lanche.



Logo ouviu uma buzina! Chegara sua condução pensou Antônio que voltou ao seu posto. A mulher que mais ao lado estava percebendo que ele a notará sorriu e disse “Boa noite! Muito axé pra o senhor!”. Sorrindo e a despedir-se acenou-lhes com a mão notando que a educada mulher aproximara-se da pobre menina órfã. Sorrindo recostou-se ao seu acento quase adormecendo e vendo a imagem da moça que tinha longos cabelos e uma maquiagem delicada e longas pernas fortes, nas quais menina recostada com olhar angelical sorria-lhe. Não bem ao certo poderia dizer mas teve a sensação de ela dizer-lhe “Que Deus o acompanhe senhor” enquanto adormecia.


Wandeson Ricardo


🌐 50 FOTOS antigas do RECIFE que você precisa ver