Versões do Debian disponíveis no ChromeOS.

Como criar um aplicativo com Python e GTK no ChromeOS

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 Chromebook (ChromeOS) 🤩.

OBS: Antes de mais nada, é necessário que o ambiente Linux esteja configurado no ChromeOS.


Posts relacionados:


    Atualmente o Chrome OS fornece pelo menos 3 versões do Debian:

    Versões do Debian disponíveis no ChromeOS.
    Versões do Debian disponíveis no ChromeOS.

    Dependendo da versão do Debian algumas configurações adicionais se fazem necessárias.

    A seguir veremos com mais detalhes esses procedimentos.


    Debian Bookworm

    A distribuição Linux Debian Bookworm possui os pacotes do GTK 4 nos seus repositórios estáveis.

    Abrar o terminal e digite o seguinte comando:

    sudo apt -t sid 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

    Assim que a instalação estiver concluída a linguagem de programação Python, o binding PyGObject e as bibliotecas do GTK estarão instaladas.

    Avance para a sessão de ambientes virtuais para dar continuidade neste tutorial.


    Debian Buster e Bullseye

    Nessas versões do Debian os pacotes do GTK 4 não estão disponíveis nos repositórios estáveis e se faz necessária a configuração do repositório sid.

    Debian sid

    Para adicionar o repositório sid é necessário editar o arquivo sources.list.

    Para editar o arquivo, abra o terminal e utilize um editor de texto como o vi ou vim, todavia se você não possui experiencia com esses editores instale o nano:

    sudo apt install nano

    Com o fim da instalação digite no terminal:

    sudo nano /etc/apt/sources.list

    Agora vamos adicionar o repositório testing (sid) no arquivo sources.list:

    # Generated by distrobuilder
    deb https://deb.debian.org/debian bullseye main
    deb https://deb.debian.org/debian bullseye-updates main
    deb https://deb.debian.org/debian-security/ bullseye-security main
    
    deb http://http.us.debian.org/debian sid main non-free contrib
    Editando o arquivo sources.list do Debian.
    Editando o arquivo sources.list do Debian.

    🚨 NÃO EXECUTE sudo apt update OU MESMO sudo apt upgrade!

    Agora precisamos criar/editar o arquivo preferences.

    Se essa configuração não for feita, o sistema tentará atualizar todos os pacotes para as ultimas versões e isso irá gerar diversos pacotes quebrados.

    No terminal execute:

    sudo nano /etc/apt/preferences

    Dentro deste arquivo digite o seguinte código:

    Package: *
    Pin: release a=stable
    Pin-Priority: 700
    
    Package: *
    Pin: release a=testing
    Pin-Priority: 650
    
    Package: *
    Pin: release a=unstable
    Pin-Priority: 600
    Editando o arquivo preferences do Debian.
    Editando o arquivo preferences do Debian.

    Salve o arquivo e agora podemos atualizar os repositórios:

    sudo apt update

    Assim que a atualização dos repositórios for finalizada execute o seguinte comando para instalar os pacotes necessários:

    sudo apt -t sid 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

    Com o fim da instalação a linguagem de programação Python, o tookit GTK 4 e o binding PyGObject estarão instalados e prontos para uso 🚀.


    Ambientes virtuais

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

    Criando o ambiente virtual

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

    python3 -m venv venv

    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 desejada 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.

    Para ativar o ambiente virtual:

    source venv/bin/activate
    Ativando o ambiente virtual. Nome do ambiente aparece no inicio do terminal.
    Ativando o ambiente virtual. Nome do ambiente aparece no inicio do terminal.

    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. no ChromeOS.
    Testando o binding PyGObject. no ChromeOS.

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

    OBS: Lembre-se que o comando deve ser executado com o ambiente virtual ativo!


    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 Visual Studio Code.
    Configurando o interpretador Python no Visual Studio Code.

    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 Visual Studio Code.
    Selecionando o interpretador Python no Visual Studio Code.

    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.
    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 ChromeOS.
    Aplicativo GTK sendo executado no ChromeOS.