Python3 + GTK+3 + Glade + Templates = <3

Vários softwares que você usa no ambiente Gnome podem ter sido desenvolvidos em Python. Aplicativos como Gnome Music e Gnome Tweaks são alguns exemplos disso.

Neste artigo eu vou mostrar um exemplo mínimo para que você tenha um ponto de partida para suas idéias. Vamos lá:

Crie um layout básico usando o editor Glade:

GtkApplicationWindow

Coisas para prestar atenção:

  • O componente raiz é um GtkApplicationWindow (aparece quando clica no botão Toplevels)
  • Com ele selecionado, marque a checkbox Composite lá na direita (super importante!)
  • Quando você marca a checkbox Composite o campo ID vira Class Name. Dê um nome e guarde ele, pois vamos usar já já.
  • Dê um ID para o botão e guarde ele, pois vamos usar já já.

Com o Botão selecionado, troque para a aba Signals:

Button Signals

  • Clique na coluna Handler da linha clicked
  • Digite a primeira letra do nome do seu botão
  • Aceite a sugestão (btnMain_clicked_cb, no meu examplo) e guarde ela, pois vamos usar já já.

Isso é tudo com o editor Glade. Salve seu .glade na pasta do seu projeto.

Crie um arquivo mínimo em Python:

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import GLib, Gio, Gtk

import sys


#
# 1. nosso arquivo .glade (pode ter o path que quiser)
#
@Gtk.Template.from_file("a.glade")
class AppWindow(Gtk.ApplicationWindow):
    #
    # 2. a 'Class Name' de GtkApplicationWindow
    #
    __gtype_name__ = "app_window"

    #
    # 3. o 'ID' do Botão
    #
    btnMain: Gtk.Button = Gtk.Template.Child()

    #
    # 4. o nome do 'Handler' de 'Signals'
    #
    @Gtk.Template.Callback()
    def btnMain_clicked_cb(self, widget, **_kwargs):
        assert self.btnMain == widget
        print(widget.get_label())


class Application(Gtk.Application):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, application_id="dev.monique.Gtk1",
                         flags=Gio.ApplicationFlags.FLAGS_NONE, **kwargs)
        self.window = None

    def do_activate(self):
        self.window = self.window or AppWindow(application=self)
        self.window.present()


if __name__ == '__main__':
    Application().run(sys.argv)

Você também vai precisar:

pip install PyGObject

Pode ser que reclame de bibliotecas faltantes, basta ler a saída de erro e instalar as dependências (eu tive que apt install libcairo2-dev libgirepository1.0-dev)

Com este código você terá tudo que precisa para começar.

Boa Sorte!

comments powered by Disqus