Desenvolvendo com Python e o toolkit GTK no Linux

Sem duvidas um dos melhores toolkit para o desenvolvimento de aplicativos com a linguagem de programação Python.

Play this article

Hoje veremos como preparar o ambiente de desenvolvimento para a criação de aplicativos com a linguagem de programação Python (PyGObject) e o toolkit gráfico GTK no Linux.

Preparar o ambiente de desenvolvimento em distribuições Linux é bem simples, na maior parte dos casos, todos os pacotes necessários estão nos repositório e podem ser instalados através do gerenciador de pacotes da distribuição.

Claro é importante notar que atualmente a melhor forma de se iniciar um novo projeto GTK é utilizando o IDE Gnome Builder juntamento com o sistema de empacotamento/distribuição flatpak 💜.


Instalação

Os comandos exibidos a seguir permitirão a execução do binding PyGObject na instalação local do Python bem como a sua utilização em um ambiente virtual (recomendado).

Arch Linux

Site oficial do Arch Linux.

📝 Os pacotes gtk4-demos e gtk4-docs são opcionais.

Dependências

sudo pacman -S \
python \
python-pip \
cairo \
pkgconf \
gobject-introspection \
gtk4 \
gtk4-demos \
gtk4-docs \
libadwaita

🚨 Se o comando sudo não estiver configurado utilize o root para realizar a instalação dos pacotes.

Fedora

Site oficial do Fedora.

🚨 Comando testado na distribuição Linux Fedora 38.

Dependências

sudo dnf install \
python3 \
python3-devel \
python3-gobject \
gcc \
pkg-config \
cairo-devel \
cairo-gobject-devel \
gobject-introspection-devel \
gtk4 \
gtk4-devel \
gtk4-devel-tools \
libadwaita-devel

openSUSE Tumbleweed

Site oficial do openSUSE Tumbleweed.

Dependências

sudo zypper install \
python311-devel \
python311-gobject \
python311-gobject-Gdk \
gcc \
pkgconf-pkg-config \
cairo-devel \
gobject-introspection-devel \
libgtk-4-1 \
gtk4-devel \
gtk4-tools \
libadwaita-devel

Ubuntu

Site oficial do Ubuntu.

🚨 Comando testado na distribuição Linux Ubuntu 22.04.

Dependências

sudo apt install \
python3-full \
python3-dev \
python3-gi \
python3-gi-cairo \
libcairo2-dev \
libgirepository1.0-dev \
gir1.2-gtk-4.0 \
libgtk-4-dev \
libadwaita-1-dev \
gtk-4-examples

📝 Para utilizar uma versão especifica da linguagem de programação Python, pode ser utilizada a seguinte sintaxe: python3.10-full python3.10-dev.

No lugar do pacote python3-full pode ser utilizado o pacote python3.

Ao finalizar as instalação dos pacotes a linguagem de programação Python, o binding PyGObject e as bibliotecas do GTK estarão instalados e prontos para uso 🚀.


Ambientes virtuais

Se você ainda não utiliza, este é um bom momento para testar algumas opções:

Eu utilizo o Poetry, contudo abaixo segue um exemplo de como criar um ambiente virtual com o venv que é nativo na linguagem de programação Python.

Criando o ambiente virtual

Acesse a pasta raiz do seu projeto, abra um terminal, em seguida execute o comando:

python3 -m venv venv

📝 Se o módulo venv não estiver instalado utilize o comando sudo apt install python3-venv ou equivalente da distribuição Linux que você utiliza.

Em distribuições Linux é comum ter mais de uma versão da linguagem de programação Python instalada.

Para criar o ambiente virtual utilizando uma versão especifica da linguagem de programação Python pode ser utilizado comando:

python3.X -m venv venv

🚨 Substitua o X pela versão da linguagem de programação Python que deseja utilizar. OBS: A versão deve estar instalada no sistema operacional!

Ativando o ambiente virtual

Após ser criado o ambiente virtual precisa ser ativo, caso contrário a instalação dos pacotes será realizada na instalação local da linguagem de programação Python e não no ambiente virtual.

Execute no terminal um dos seguintes comandos.

bash/zsh (mais comum):

source venv/bin/activate

fish:

source venv/bin/activate.fish

csh/tcsh:

source venv/bin/activate.csh

Ativando o ambiente virtual do Python no Linux.

Instalando o binding

Com o ambiente virtual ativo, vamos começar atualizando o gerenciador de pacotes do Python (pip) com o comando:

python -m pip install --upgrade pip

Em seguida vamos instalar o binding PyGObject e a biblioteca PyGObject-stubs com o comando:

pip install pygobject PyGObject-stubs

Perfeito com isso podemos iniciar o desenvolvimento em um ambiente onde as dependências estão isolada 😃.


Testando

A forma mais simples de testar a comunicação entre a linguagem de programação Python e o toolkit gráfico GTK, é executar no terminal o comando:

python3 -c "import gi"

Testando o binding PyGObject.

Se ao executar o comando nenhum erro for retornado, a instalação e configuração estão corretas 👍👋👋.


Configurando o interpretador Python

Visual Studio Code (VSCode)

Abra o Visual Studio Code, crie um novo arquivo e salve o mesmo com o nome main.py ou qualquer outro nome que preferir.

No canto inferior direito do Visual Studio Code clique na opção Select python interpreter, pode ser que haja um interpretador Python selecionado, basta clicar sobre o mesmo para alterar:

Configurando o interpretador Python no VSCode.

Ao clicar nessa opção será aberto um menu onde você pode selecionar os interpretadores e ambientes virtuais disponíveis:

Selecionando o interpretador Python no VSCode.

PyCharm

Já no PyCharm vá até o menu File e clique na opção Settings, dentro de Settings procure por Python Interpreter e adicione o caminho até o interpretador Python ou ambiente virtual:

Configurando o interpretador Python no PyCharm.


Código

Para testar a configuração no seu editor de texto ou IDE utilize o seguinte código de exemplo:

# -*- coding: utf-8 -*-
"""Python e GTK: PyGObject Gtk.ApplicationWindow()."""

import gi

gi.require_version(namespace='Gtk', version='4.0')
gi.require_version(namespace='Adw', version='1')

from gi.repository import Adw, Gio, Gtk

Adw.init()


class ExampleWindow(Gtk.ApplicationWindow):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        self.set_title(title='Python e GTK: PyGObject Gtk.ApplicationWindow()')
        self.set_default_size(width=int(1366 / 2), height=int(768 / 2))
        self.set_size_request(width=int(1366 / 2), height=int(768 / 2))

        headerbar = Gtk.HeaderBar.new()
        self.set_titlebar(titlebar=headerbar)

        menu_button_model = Gio.Menu()
        menu_button_model.append('Preferências', 'app.preferences')

        menu_button = Gtk.MenuButton.new()
        menu_button.set_icon_name(icon_name='open-menu-symbolic')
        menu_button.set_menu_model(menu_model=menu_button_model)
        headerbar.pack_end(child=menu_button)

        # O seu código aqui:
        # ...


class ExampleApplication(Adw.Application):

    def __init__(self):
        super().__init__(application_id='br.com.justcode.Example',
                         flags=Gio.ApplicationFlags.FLAGS_NONE)

        self.create_action('quit', self.exit_app, ['<primary>q'])
        self.create_action('preferences', self.on_preferences_action)

    def do_activate(self):
        win = self.props.active_window
        if not win:
            win = ExampleWindow(application=self)
        win.present()

    def do_startup(self):
        Gtk.Application.do_startup(self)

    def do_shutdown(self):
        Gtk.Application.do_shutdown(self)

    def on_preferences_action(self, action, param):
        print('Ação app.preferences foi ativa.')

    def exit_app(self, action, param):
        self.quit()

    def create_action(self, name, callback, shortcuts=None):
        action = Gio.SimpleAction.new(name, None)
        action.connect('activate', callback)
        self.add_action(action)
        if shortcuts:
            self.set_accels_for_action(f'app.{name}', shortcuts)


if __name__ == '__main__':
    import sys

    app = ExampleApplication()
    app.run(sys.argv)

Como resultado do código de exemplo temos:

Aplicativo GTK sendo executado no Linux.

Perfeito, agora podemos iniciar o estudo deste fantástico toolkit gráfico.


Extra

Se você não programa com Python fique tranquilo.

O GTK também possui bindings para outras linguagens de programação como:

Em outro post veremos como configurar o ambiente de desenvolvimento GTK no Microsoft Windows 😉.


Did you find this article valuable?

Support Renato Cruz by becoming a sponsor. Any amount is appreciated!