Kirigami com o Python
Pré-requisitos
Antes de começar, precisaremos instalar o Kirigami e o PySide em nossa máquina.
sudo pacman -S python-pipx python-pyqt6 pyside6 kirigami flatpak-builder qqc2-desktop-style appstream | |
sudo zypper install python3-pipx python3-qt6 python3-pyside6 kf6-kirigami-devel flatpak-builder kf6-qqc2-desktop-style AppStream-compose | |
sudo dnf install pipx python3-pyqt6 python3-pyside6 kf6-kirigami-devel flatpak-builder kf6-qqc2-desktop-style appstream-compose |
Se você estiver usando uma distribuição com pacotes PySide6 ou PyQt6 antigos, este tutorial funciona com Construindo software com o distrobox.
Estrutura do projeto
Primeiro, criamos a pasta do nosso projeto (você pode usar os comandos abaixo). Vamos chamá-la de kirigami_python/
.
kirigami_python/
├── README.md
├── LICENSE.txt
├── MANIFEST.in # Para adicionar nossos arquivos QML
├── pyproject.toml # O arquivo principal para gerenciar o projeto
├── org.kde.kirigami_python.desktop
└── src/
├── __init__.py # Para importar o diretório src/ como um pacote
├── __main__.py # Para sinalizar o aplicativo como ponto de entrada
├── app.py
└── qml/
└── Main.qml
O nome do pacote será kirigami_python
, o "executável" (script de console) será chamado de kirigami_hello
e o ponto de entrada será app
.
Dica
Para gerar rapidamente essa estrutura de pastas, basta executar:mkdir -p kirigami_python/src/qml/
.Para um projeto mais abrangente que aprofunde mais detalhes sobre essa estrutura de arquivo, consulte Projeto completo em Python + Kirigami.
pyproject.toml
Aplicações Python modernas precisam apenas de um único arquivo TOML para especificar todos os metadados, informações de pacotes e dependências, conforme PEP 621. O a seguir serve como um bom ponto de partida para uma aplicação e pode ser estendido posteriormente.
A maior parte do conteúdo deste arquivo é padrão, e uma versão mais completa dele pode ser vista em Python com Kirigami: Estrutura Geral.
|
|
Observe as linhas destacadas. Conforme mencionado em Estrutura do projeto, o nome do pacote é kirigami_python
, o nome do executável é kirigami_hello
e o nome do ponto de entrada é app
. Em particular, o seguinte deve ser observado:
- O script do projeto consiste em um script de ponto de entrada que será gerado pelo setuptools para a execução do aplicativo, neste caso
kirigami_hello
. - O script de projeto gerado
kirigami_hello
executa a funçãomain()
no scriptapp.py
no pacotekirigami_python
. - O
package-dir
padrão para projetos Python geralmente é o diretório raiz. Neste caso, ele é substituído pelo subdiretóriosrc/
, agindo como se fosse o diretório raiz do pacote. - O
package-dir
é o motivo pelo qual o script do projeto gerado executakirigami_python → app
em vez dekirigami_python → src → app
. - O
package-dir
também é o motivo pelo qual a chamadaimportlib.resources.files()
em app.py executakirigami_python → qml → Main.qml
em vez dekirigami_python → src → qml → Main.qml
.
Veja Executando diretamente, como um módulo e como um script de console para detalhes.
org.kde.kirigami_python.desktop
O objetivo principal dos arquivos de entrada de desktop é exibir seu aplicativo no inicializador de aplicativos do Linux. Outro motivo para tê-los é para ter ícones de janela no Wayland, pois eles são necessários para informar ao compositor que "esta janela combina com este ícone".
Ele deve seguir um esquema de nomenclatura DNS reverso seguido pela extensão .desktop
, como org.kde.kirigami_python.desktop
:
|
|
Nota
Os ícones de janelas e da barra de tarefas funcionarão em uma sessão do Wayland somente se os arquivos da área de trabalho dos aplicativos estiverem em~/.local/share/applications
ou /usr/share/applications
. Para que os ícones funcionem neste tutorial, copie o arquivo da área de trabalho do aplicativo para lá.MANIFEST.in
Este arquivo é simplesmente uma declaração de arquivos de código-fonte adicionais que devem estar presentes no pacote quando o aplicativo for executado. Por padrão, o Python não inclui arquivos QML em pacotes, e eles precisam estar disponíveis para que o aplicativo seja executado.
|
|
src/app.py
|
|
Como este é um aplicativo GUI, queremos que a função principal seja executada apenas quando o script for executado, não quando for importado. Portanto, precisamos da condição if __name__ == "__main__"
no final do arquivo. Consulte [Executando diretamente, como um módulo e como um script de console](/docs/getting-started/python/python-package #running-directly-as-a-module-and-as-a-console-script) para obter detalhes.
Criamos um QGuiApplication e inicializamos o mecanismo QML. Com QGuiApplication.exec()
, o aplicativo continuará em execução até ser fechado. Em seguida, importlib.resources.files()
obtém o caminho para um arquivo presente no pacote, ou seja, nosso Main.qml
. Com esse caminho, carregamos o arquivo QML no mecanismo QML como o ponto de entrada principal para a interface do aplicativo.
src/__init__.py
Crie um arquivo vazio kirigami_python/src/__init__.py
. Este arquivo só precisa estar presente para importar um diretório como um pacote.
touch __init__.py
src/__main__.py
Crie um kirigami_python/src/__main__.py
com o seguinte conteúdo:
|
|
Isso simplesmente adiciona o conteúdo do diretório atual (src/
) e o importa como um módulo chamado app
, e então executa imediatamente a função main()
do aplicativo.
src/qml/Main.qml
|
|
É aqui que manipularemos o frontend do nosso aplicativo.
Se você conhece um pouco de Javascript, grande parte do QML lhe parecerá familiar (embora tenha suas peculiaridades). A documentação do Qt possui um vasto material sobre esta linguagem, caso você queira experimentar algo por conta própria. Ao longo destes tutoriais, concentraremos grande parte da nossa atenção em nosso código QML, onde podemos usar o Kirigami para aproveitá-lo ao máximo.
Por enquanto, vamos nos concentrar em Main.qml
. Primeiro, importamos alguns módulos importantes:
- QtQuick, a biblioteca padrão usada em aplicativos QML.
- QtQuick Controls, que fornece uma série de controles padrão que podemos usar para tornar nossos aplicativos interativos.
- QtQuick Layouts, que fornece ferramentas para posicionar componentes na janela do aplicativo.
- Kirigami, que fornece uma série de componentes adequados para a criação de aplicativos que funcionam em dispositivos de diferentes formatos e tamanhos.
Nota
Colocar os controles do QtQuick e as importações do Kirigami em namespaces separados usando a palavra-chaveas
é uma prática recomendada que garante que nenhum componente com o mesmo nome possa entrar em conflito. Você pode ver nomes diferentes para os controles do QtQuick por aí, como "QQC" ou "QQC2". Usaremos "Controles" neste tutorial para maior clareza.Chegamos então ao nosso elemento base, Kirigami.ApplicationWindow, que fornece alguns recursos básicos necessários para todos os aplicativos Kirigami. Esta é a janela que conterá cada uma das nossas páginas, as principais seções da nossa interface.
Em seguida, definimos a propriedade id
da janela como "root". IDs são úteis porque nos permitem referenciar exclusivamente um componente, mesmo que tenhamos vários do mesmo tipo.
Também definimos a propriedade title
da janela como "Hello World".
Em seguida, definimos a primeira página da nossa pilha de páginas. A maioria dos aplicativos Kirigami é organizada como uma pilha de páginas, cada uma contendo componentes relacionados adequados a uma tarefa específica. Por enquanto, estamos mantendo a simplicidade e nos atendo a uma única página. pageStack é uma pilha de páginas inicialmente vazia fornecida por Kirigami.ApplicationWindow, e com pageStack.initialPage:Kirigami.Page {...}
definimos a primeira página apresentada ao carregar o aplicativo como uma Kirigami.Page. Esta página conterá todo o nosso conteúdo.
Por fim, incluímos em nossa página um Controls.Label que nos permite inserir texto em nossa página. Usamos anchors.centerIn:parent
para centralizar nosso rótulo horizontal e verticalmente dentro do nosso elemento pai. Neste caso, o componente pai do nosso rótulo é Kirigami.Page. A última coisa que precisamos fazer é definir seu texto: text: "Hello World!"
.
Executando o aplicativo
Você pode executar o script de console kirigami_hello
sem precisar instalá-lo primeiro:
pipx run --system-site-packages --spec . kirigami_hello
A flag --system-site-packages
é necessária para que o Python tenha acesso aos pacotes Python da sua distribuição. Isso é necessário porque o Kirigami e o PySide precisam ter sido compilados com a mesma versão do Qt para funcionar, o que é o caso quando ambos vêm da distribuição.
A flag --spec
determina o caminho para o código-fonte ou pacote wheel que contém o programa, e kirigami_hello
é o script executável a ser executado.
Para compilar e instalar o pacote Python, execute:
pipx install --force --system-site-packages .
O pacote será instalado em ~/.local/share/pipx/venvs/kirigami-python
, e um script executável será instalado em ~/.local/bin/kirigami_hello
.
Uso de pipx versus pip
Ao contrário de Python com Kirigami: Criando um pacote Python, este tutorial utilizou pipx
para facilitar a execução e a instalação do projeto. Os mesmos passos podem ser executados manualmente com venv
, build
e pip
, como no tutorial mais completo.
O pipx
é útil e recomendado conforme PEP 668 para executar aplicativos Python, enquanto pip
é multifuncional e também pode ser usado para módulos Python importáveis.
Depois disso, o aplicativo pode ser iniciado executando:
kirigami_hello
Para executar o novo aplicativo QML no modo para dispositivo móvel, você pode usar QT_QUICK_CONTROLS_MOBILE=1
:
QT_QUICK_CONTROLS_MOBILE=1 kirigami_hello
Pronto! Agora você verá seu primeiro aplicativo Kirigami aparecer diante dos seus próprios olhos.