DNF5, Comandos

Descrição dos comandos do DNF


A descrição dos comandos listada abaixo é uma versão um pouco resumida dos documentos Read the Docs. Em todos os casos, nessa página, o comando dnfé um aliás para dnf5.

Comando advisory

Uso: dnf5 advisory [options] [<advisory-spec>...

advisory permite vários tipos de consultas para obter recomendações e advertências sobre pacotes. Argumentos opcionais podem ser passados em <advisory-spec> ​​para filtrar recomendações com nomes específicos.

Subcomandos:
list Lista recomendações disponíveis.
info Imprime detalhes sobre recomendações.
summary Imprime um resumo das recomendações.
Opções:
–all Mostra recomendações contendo qualquer versão dos pacotes instalados.
–available Mostra recomendações contendo versões mais recentes dos pacotes instalados. (Default).
–installed Mostra recomendações contendo versões iguais e mais antigas dos pacotes instalados.
–updates Mostra recomendações de versões mais recentes dos pacotes instalados, se existir versão mais recente disponível.
–contains-pkgs=NOME_DO_PACOTE,… Mostra apenas recomendações contendo pacotes com nomes especificados.
Esta é uma opção de lista.
Somente pacotes instalados são correspondidos. Podem ser usados globs.
–security Considera somente o conteúdo contido em avisos de segurança.
–bugfix Considera somente o conteúdo contido em avisos de correção de bugs.
–enhancement Considera somente o conteúdo contido em avisos de aprimoramento.
–newpackage Considera somente o conteúdo contido em avisos de newpackage.
–advisory-severities=ADVISORY_SEVERITY,… Considera somente o conteúdo contido em avisos com gravidade especificada.
Esta é uma opção de lista.
Os valores aceitos são: critical, important, moderate, low, none.
–bzs=BUGZILLA_ID,… Considera somente o conteúdo contido em avisos que corrigem um tíquete de ID do Bugzilla fornecido.
Esta é uma opção de lista.
Os valores esperados são IDs numéricos, por exemplo. 123123.
–cves=CVE_ID,… Considera apenas o conteúdo contido em avisos que corrigem um tíquete de ID CVE (Common Vulnerabilities and Exposures) fornecido.
Esta é uma opção de lista.
Os valores esperados são IDs de string no formato CVE, por exemplo, CVE-2201-0123.
–with-bz Mostra apenas avisos que fazem referência a um tíquete do Bugzilla.
–with-cve Mostra apenas avisos que fazem referência a um tíquete CVE.
Exemplos:
# mostra informações e avisos sobre o nome fornecido.
$ dnf advisory FEDORA-2022-07aa56297a

# mostra resumo dos avisos sobre pacotes kernel ou kernel-core com referência a tíquetea do Bugzilla.
$ dnf advisory summary --contains-pkgs=kernel,kernel-core --with-bz

# mostra lista de avisos de segurança ou avisos com gravidade importante
$ dnf advisory list --security --advisory-severities=important

Comando autoremove

Uso: dnf autoremove

autoremove é usado para remover do sistema pacotes desnecessários. Esses pacotes foram provavelmente instalados como dependências para algum aplicativo mais tarde desinstalado, e não são mais exigidos por nenhum aplicativo.

Nota: Pacotes somente de instalação (por exemplo, kernels) nunca são removidos automaticamente por este comando, mesmo que tenham sido instalados como dependências.

A opção –offline armazena a transação para ser executada offline. Essas transações são executadas quando o sistema é inicializado em um ambiente mínimo, o que pode ser mais seguro do que a execução em um sistema inicializado normalmente, já que a transação tem menos probabilidade de interferir em processos sendo executados.

Opção:
–offline Armazena a transação para ser executada offline.Veja opção offline
Exemplos de uso:
$ sudo dnf autoremove
[sudo] senha para guilherme: 
 Pacote                   Arch        Versão              Repositório       Tamanho
 perl-Mozilla-CA          noarch      20240730-1.fc41     anaconda          9.8 KiB

Is this ok [y/N]: y
Executando transações
[1/2] Preparar transação                                         100% |   2.0   B/s |   1.0   B |  00m00s
[2/2] Removendo perl-Mozilla-CA-0:20240730-1.fc41.noarch         100% |  13.0   B/s |   6.0   B |  00m00s

# para postergar a execução para ambiente mínimo
$ sudo dnf autoremove --offline
➡ Nada a fazer!

Comando check

Uso: dnf check [options]

Verifica o banco de dados packagedb local e responde com informações sobre problemas encontrados. Os testes a serem executados podem ser selecionados com as opções:

Opções:
–dependencies exibe dependências faltantes e conflitos.
–duplicates exibe pacotes duplicados.
–obsoleted exibe pacotes obsoletos.
$ dnf check
$ dnf check --dependencies
$ dnf check --duplicates
$ dnf check --obsoleted
# nenhuma mesagem 'exibido porque o sistema está livre de problemas

Comando check-upgrade

Uso: dnf check-upgrade [options] [<package-spec>...]

Faz uma verificação não interativa para atualizações disponíveis do pacote específico. Se nenhum <package-spec> for especificado o comando verifica por atualizações de todos os pacotes do sistema. Termina exibe no terminal o código 0 se não existirem atualizações; e o código 100, junto com lista dos pacotes, se existirem.

As seguintes opções podem se usadas:
–changelogs Imprime os changelogs do pacote,
–advisories=ADVISORY_NAME,… Considera apenas o conteúdo contido em avisos com nome especificado.
Esta é uma lista de opções.
Os valores esperados são IDs de avisos, por exemplo, FEDORA-2201-123.
–advisory-severities=ADVISORY_SEVERITY,… Considera apenas o conteúdo contido em avisos com gravidade especificada.
Esta é uma lista de opções. Os valores aceitos são:critical, important, moderate, low, none.
–bzs=BUGZILLA_ID,… Considera apenas o conteúdo contido em avisos que corrigem um tíquete com um ID do Bugzilla.
Esta é uma lista de opções. Valores esperados são IDs numéricos, por exemplo, 123123.
–cves=CVE_ID,… Considera apenas o conteúdo contido em avisos que corrigem um tíquete CVE (Common Vulnerabilities and Exposures) com ID fornecido.
Esta é uma lista de opções. Os valores esperados são IDs de string no formato CVE, por exemplo, CVE-2201-0123.
–security Considera apenas o conteúdo contido em avisos de segurança.
–bugfix Considera apenas o conteúdo contido em avisos de correção de bugs.
–enhancement Considera apenas o conteúdo contido em avisos de aprimoramento.
–newpackage Considera apenas o conteúdo contido em avisos de novo pacote.
–minimal Relata as versões mais baixas de pacotes que corrigem avisos do tipo bugfix, enhancement, security ou
newpackage. Se uma opção que limite avisos seja usada, o relato inclui as versões mais antigas de pacotes
que corrigem avisos correspondentes às propriedades de aviso selecionadas
Exemplos:
# imprime lista de pacotes que têm atualizações disponíveis
$ dnf check-upgrade

# imprime logs de alterações para todos os pacotes com atualizações pendentes
$ dnf check-upgrade --changelogs

Comando clean

Uso: dnf clean [options] <cache_types>...

O comando dnf clean é usado para apagar metadata temporariamente matido em repositórios, ou para marcar que um cache está expirado.
Os argumentos em <cache_types> especificam que tipo de dados em cache devem ser limpos.

Argumentos:
all apaga todos os dados temporários de repositórios no sistema,
packages apaga todos os pacotes em cache,
metadata apaga metadados dos repositórios. Isso apaga os arquivos que o DNF5 usa para determinar a disponibilidade remota dos pacotes. Usando essa opção fará com que o DNF baixe todos os metadados em sua próxima execução,
dbcache apaga os arquivos de cache gerados pelo repositório, forçando o DNF a regenerar o cache em sua próxima execução,
expire-cache marca como expirados os metadados do repositório, forçando o DNF a verificar a disponibilidade do cache em sua próxima execução.
Alguns exemplos de uso:
# limpa todos os dados em cache no repositório
$ dnf clean all

# limpa todos os pacotes em cache e metadados no dbcache
$ dnf clean packages dbcache

Comando distro-sync

Uso: dnf distro-sync [options] [<especificação-pacote>...]

O comando dnf distro-sync serve para sincronizar os pacotes instalados com sua versão mais recente disponível em qualquer dos repositórios habilitados. Ele pode ser usado para atualizar, fazer downgrade ou manter pacotes. Argumentos opcionais podem especificar pacotes a serem sincronizados:

Opções:
–allowerasing permitir a remoção de pacotes instalados para resolver quaisquer problemas potenciais de dependência,
–skip-broken Resolver quaisquer problemas de dependência removendo pacotes que estejam causando problemas da transação,
–skip-unavailable Permitir pular pacotes que não são possíveis de sincronizar. Todos os pacotes restantes serão sincronizados,
–downloadonly Baixar o conjunto de pacotes resolvidos sem executar uma transação RPM,
–offline Armazenar a transação a ser executada offline. Veja o comando Offline.
Exemplos de uso:
# sincroniza todo o sistema com a versão mais recente disponível dos pacotes.
$ dnf distro-sync

# Sincroniza o pacote vim com a versão mais recente disponível.
$ dnf distro-sync vim

Comando downgrade

Uso: dnf downgrade [opções] <package-spec>...

downgrade é usado para fazer o downgrade dos pacotes especificados na lista package-spec. É escolhida a versão mais alta, abaixo da versão sendo substituída, quando possível. Se a versão passada no argumento é inferior à versão instalada, o downgrade se dá para esta versaõ especificada.

Opções:
–allowerasing Permite remover pacotes instalados para solucionar problemas de dependência.
–skip-broken Resolve problemas de dependência removendo pacotes que estão causando problemas na transação.
–skip-unavailable Ignora pacotes que não podem passar por rebaixamento. Os demais pacotes são rebaixados.
–allow-downgrade Permite o rebaixamento de dependências na operação solicitada.
–no-allow-downgrade Desabilita o rebaixamento de dependências na operação solicitada.
–downloadonly Baixa os pacotes exigidos sem executar nenhuma transação RPM.
–offline Armazena a transação para ser executada offline. Veja o comando Offline.

Nessa tabela usamos rebaixar para a expressão downgrade, que significa passar para uma versão inferior

Exemplos de uso:
# downgrade do pacote nano para a versão fornecida
$ dnf downgrade nano-0:6.0-2.fc36

# Faça downgrade gcc e glibcpacotes, permitindo a remoção de pacotes instalados quando necessário
$ dnf downgrade gcc glibc --allowerasing

Comando download

Uso: dnf download [options] <package-spec>...

download é usado para baixar pacotes binários de origem definidos nos argumentos package-spec para o diretório de trabalho atual.

Opções:
–arch Limita a pacotes de arquiteturas dadas.
–resolve Resolve dependências de pacotes especificados e baixa os que faltam.
–alldeps Usado junto com –resolve, baixa todas as dependências, inclusive as já instaladas.
–destdir=<path> Define o diretório usado para baixar pacotes. O default é o diretório atual.
–srpm Baixa o rpm de origem e habilita todos os repositórios utilizados.
–url Imprime a lista de URLs onde os rpms podem ser baixados, sem fazer nenhum download.
–urlprotocol Usado junto com –url, filtra as URLs para os protocolos especificados: http, https, ftp, ou file. Pode ser usada várias vezes.
–allmirrors Usado com –url, imprime URLs separadas por espaços de todos os mirrors disponíveis para cada pacote.
Exemplos de uso:
# Baixa o pacota kernel-headers usando o formato NEVRA completo. 
$ dnf download kernel-headers-0:5.17.0-300.fc36.i686

# Baixa todos os pacotes com o nome rpm ou rpm-devel.
$ dnf download rpm rpm-devel

# Baixe o pacote maven-compiler-plugin com todas as dependências.
$ dnf download maven-compiler-plugin --resolve --alldeps

# Baixa o pacote maven-compiler-plugin para o diretório /temp/pacotes.
$ dnf download --destdir /temp/pacotes maven-compiler-plugin

# Lista a URL http para baixar o pacote python.
$ dnf download --url --urlprotocol http python

# Baixa o python com a arquitetura x86_64.
$ dnf download python --arch x86_64

# Baixe o rpm do dnf.
$ dnf download dnf --srpm

Comando environment

Uso: dnf environment <subcommand> [options] [...]

environment faz consultas sobre ambientes e grupos relacionados a eles. Argumentos opcionais em environment-spec servem como filtros para selecionar ambientes.

Subcomandos:
list Lista ambientes disponíveis.
info Imprime detalhes sobre os ambientes.
Opções:
–available Mostra ambientes disponíveis mas não instalados.
–installed Mostrar apenas ambientes instalados.
Exemplos de uso:
# Mostrar lista de todos os ambientes.
$ dnf environment list

# Mostrar informações detalhadas sobre o KDEambiente.
$ dnf environment info "KDE Plasma Workspaces"

Comando group

Uso: dnf group {list|info} [options] [...]

Uso: dnf group {install|remove|upgrade} [options] ...

group permite consultas para obter informações sobre grupos, pacotes relacionados a eles e também é usado para instalação de grupos. Para consultar ambientes, use environment.
Nota: dnf4 lista ambientes e grupos com o comando group.

Argumentos opcionais podem ser passados em group-spec ​​para filtrar grupos.

Subcomandos
list Lista todos os grupos correspondentes, instalados e disponíveis. Se nenhum parâmetro for especificado, lista os grupos conhecidos. As opções –installed e –available restringem a lista solicitada. Se –hidden for usado grupos ocultos também são listados.
info Imprime informações detalhadas sobre grupos. Aceita as mesmas opções que list.
install Marca grupos especificados e instala seus pacotes. Se a –with-optional for especificado, pacotes opcionais são inclídos. Por default todos os pacotes Mandatory e Default serão instalados se possível. Pacotes condicionais são instalados se atenderem aos requisitos. [Pode ser configurado por dnf-conf(5) , group_package_types].
Se o grupo estiver parcialmente instalado, o comando instala os pacotes ausentes.
–no-packages faz com que nenhum pacote novo seja instalado. Apenas pacotes de grupos instalados são considerados para instalação.
remove Remove os pacotes do sistema e marca o grupo como removido. Ignora pacotes que pertencem a outro grupo instalado e não foram instalados pelo usuário.
Se –no-packages for usada, nenhum pacote será removido.
upgrade Atualiza a definição do grupo especificado e os pacotes desse grupo. Caso novos pacotes sejam adicionados à definição do grupo após sua instalação, os novos pacotes serão instalados. Se alguns pacotes forem removidos da definição do grupo, eles serão desinstalados, exceto se foram instalados por um motivo diferente (por exemplo, instalados explicitamente por um usuário ou instalados implicitamente como uma dependência).
Opções para list e info:
–available Mostra só grupos disponíveis, não instalados mas são conhecidos pelo DNF5.
–installed Mostra apenas grupos instalados.
–hidden Inclui grupos ocultos.
–contains-pkgs Mostra apenas grupos contendo pacotes com nomes especificados. A opção list suporta globs.
Opções para install, remove e upgrade:
–with-optional Inclui pacotes opcionais dos grupos, usado com install.
–no-packages Opera exclusivamente nos grupos sem manipular nenhum pacote. Usado com install e remove.
–allowerasing Permite a remoção de pacotes instalados para resolver problemas de dependência. Usado com os comandos install e upgrade.
–skip-broken Resolve problemas de dependência removendo os pacotes que causam problemas na transação. Usado com install.
–skip-unavailable Permite que se ignore pacotes que não podem ser instalados ou atualizados. Usado com install e upgrade.
–allow-downgrade Permite o downgrade de dependências para resolver a operação solicitada. Usado com install e upgrade.
–no-allow-downgrade Impede o downgrade de dependências ao resolver a operação solicitada. Usado com os install e upgrade.
–downloadonly Baixa os pacotes requeridos sem executar uma transação RPM.
Usado com install e upgrade.
–offline Armazena a transação para ser executada offline. Veja o comando Offline.
Exemplos de uso:
# Mostra lista de todos os grupos, incluindo os ocultos
$ dnf group list --hidden

# Mostrar informações detalhadas sobre todos os grupos relacionados a Xfce
$ dnf group info *xfce*

# Instalar o grupo mysql incluindo pacotes opcionais.
$ dnf group install mysql --with-optional

# Atualiza pacotes do grupo mysql em conformidade com a definição atual do grupo.
$ dnf group upgrade mysql

Comando history

Uso: dnf history <subcommand> [options] []

history permite exibe um histórico de transações e oferece opções sobre esses transações, como desfazer ou refazer uma transação. Pressupõe-se que a opção de configuração history_record estava ajustadas quando as transações foram efetuadas.

Subcomandos:
list Lista informações sobre transações registradas no sistema.
info Imprime detalhes sobre transações específicas.
undo Desfaz todas as ações da transação especificada.
redo Repete a transação especificada.
Usa automaticamente –ignore-extras e –ignore-installed.
Diferente dos demais comandos do history, ele sobreescreve os motivos das transações de pacotes já instalados.
Útil para finalizar transações interrompidas.
rollback Desfaz todas as transações realizadas após a transação especificada.
store Armazena a transação em um diretório.
Opções para list e info:
–reverse Inverte a ordem das transações listadas.
Opções para undo, rollback e redo:
–skip-unavailable Permite ignorar e pular ações sobre pacotes não são possíveis de executar.
Opções para undo e rollback:

–ignore-extras
Ignaora pacotes extras incluídos na transação como erros. Mesmo assim eles são reportados como avisos.
–ignore-installed Não trata como erro a incompatibilidades entre pacotes de transações instalados e armazenados.
Mesmo assim são reportados como avisos. O uso dessa opção pode resultar em uma transação vazia.
Para ações de instalação, pule os pacotes já instalados.
Para ações de atualização, ignore grupos ou ambientes que não estão instalados.
Para remover ações, pule pacotes/grupos/ambientes não instalados.
Exemplos de uso:
# Lista todas as transações, da mais recente para mais antigas.
$ dnf history list

# Mostra informações detalhadas sobre a quarta transação.
$ dnf history info 4

# Mostra informações detalhadas sobre a última transação.
$ dnf history info last

# Mostra informações detalhadas sobre a penúltima transação.
$ dnf history info last-1

# Lista transações com ID no intervalo de 4 a 8.
$ dnf history list 4..8

# Desfaz a última transação.
$ dnf history undo last

# Desfaça a quarta transação ignorando pacotes baixados para a transação de reversão
$ dnf history undo 4 --ignore-extras

Comando info

Uso: dnf info [options] [<package-spec>...]

Imprime informações detalhadas sobre os pacotes com base nos parâmetros fornecidos.

Opções:
–showduplicates Mostra todas as versões dos pacotes, e não apenas a mais recente.
–installed Lista só pacotes instalados.
–available Lista apenas pacotes disponíveis.
–extras Lista apenas extras (pacotes instalados no sistema mas não disponíveis em nenhum repositório conhecido).
–obsoletes Lista apenas os pacotes instalados que estão obsoletos em relação a pacotes de qualquer repositório conhecido.
–recent Lista só pacotes adicionados recentemente aos repositórios.
–upgrades Lista apenas as atualizações disponíveis para os pacotes instalados.
–autoremove Lista apenas os pacotes que serão removidos pelo comando autoremove.
Exemplos de uso:
# mostra informações detalhadas sobre pacotes instalados e disponíveis.
$ dnf info

# Imprime informações sobre pacotes recentes cujos nomes começam por gnome.
$ dnf info --recent gnome*

Comando install

Uso: dnf install [options] <package-spec>|@|@...

install é usado para instalar pacotes, grupos ou ambientes. Ao instalar pacotes definidos em package-specargumentos, DNF5garante que os pacotes e suas dependências estejam instalados no sistema. Se os pacotes especificados já estiverem instalados, o DNF5 não verifica suas dependências novamente e simplesmente verifica se os pacotes em si estão presentes.

Ao instalar grupos definidos nos argumentos group-spec, DNF5 garante que os grupos e seus pacotes sejam instalados no sistema. Instala apenas pacotes de grupo que correspondem ao tipo de pacote configurado.

Opções:
–allowerasing Permite a remoção de pacotes instalados para resolver problemas de dependência.
–skip-broken Resolve problemas de dependência removendo os pacotes que estão causando problemas da transação.
–skip-unavailable Permite pular pacotes que não estão disponíveis em repositórios. Todos os pacotes disponíveis são instalados.
–allow-downgrade Habilite o downgrade de dependências ao resolver a operação solicitada.
–no-allow-downgrade Desabilite o downgrade de dependências ao resolver a operação solicitada.
–downloadonly Baixe o conjunto de pacotes resolvido sem executar uma transação RPM.
–offline Armazene a transação a ser executada offline. Veja o comando Offline.
–advisories=ADVISORY_NAME,… Considere apenas o conteúdo contido em avisos com nome especificado. Esta é uma opção de lista.
Os valores esperados são IDs de consultoria, por exemplo, FEDORA-2201-123.
–advisory-severities=ADVISORY_SEVERITY,… Considere apenas o conteúdo contido em avisos com gravidade especificada.
Esta é uma opção de lista.
Os valores aceitos são: critical, important, moderate, low, none.
–bzs=BUGZILLA_ID,… Considere apenas o conteúdo contido em avisos que corrigem um tíquete de um determinado ID do Bugzilla.
Esta é uma opção de lista.
Os valores esperados são IDs numéricos, por exemplo, 123123.
–cves=CVE_ID,… Considere apenas o conteúdo contido em avisos que corrigem um tíquete de determinado ID CVE (Common Vulnerabilities and Exposures).
Esta é uma opção de lista.
Os valores esperados são IDs de string no formato CVE, por exemplo, CVE-2201-0123.
–security Considere apenas o conteúdo contido em avisos de segurança.
–bugfix Considere apenas o conteúdo contido em avisos de correção de bugs.
–enhancement Considere apenas o conteúdo contido em avisos de aprimoramento.
–newpackage Considere apenas o conteúdo contido nos avisos do novo pacote.
Exemplos de uso:
# Instala o pacote tito.
$ dnf install tito

# Instala o arquivo rpm no diretório fornecido.
$ dnf install ~/Downloads/tito-0.6.21-1.fc36.noarch.rpm

# Instala o pacote tito na versão especificada.
# Se o pacote já estiver instalado, ele tentará fazer o downgrade ou o upgrade para a versão dada.
$ dnf install tito-0.6.21-1.fc36

# Instala todos os pacotes que pertencem ao FEDORA-2022-07aa56297 advisory.
$ dnf install --advisory=FEDORA-2022-07aa56297a \*

Comando leaves

O comando leaves serve para todos os pacotes “leafes” (folhas). Pacotes “leafes” são aqueles que estão instalados mas não são dependência de outro pacote instalado. Isso ocorre, por exemplo, quando dois ou mais pacotes marcam um ao outra como dependência, em um ciclo fechado, embora não sejam exigidos por nenhum outro pacote. Esse comando lista pacotes classificados por grupo, sendo o primeiro pacote no grupo marcado pelo caracter .

Opções:

leaves não possui opções, embora considere a configuração install_weak_deps. Se install_weak_deps = false as dependências fracas são ignoradas durante o processamento do conjunto de pacotes leaves.

Por que isso é útil? A lista de pacotes leaves dá uma visão geral e enxuta do que está instalado no sistema. Todos os pacotes que aparecem na lista de leaves podem ser desinstalados sem quebrar nenhuma dependência do sistema.

Exemplo de uso:
# para listar os pacotes "leaves"
$ sudo dnf leaves	
- bluedevil-0:6.2.3-1.fc41.x86_64
- bluez-cups-0:5.79-1.fc41.x86_64
- breeze-gtk-gtk2-0:6.2.3-1.fc41.noarch
- breeze-gtk-gtk3-0:6.2.3-1.fc41.noarch
- breeze-gtk-gtk4-0:6.2.3-1.fc41.noarch
- brltty-0:6.6-19.fc41.x86_64
- cifs-utils-0:7.1-2.fc41.x86_64
- cifs-utils-info-0:7.1-2.fc41.x86_64
# [a lista está truncada]

# para remover "bluedevil-0:6.2.3-1.fc41.x86_64"
$ sudo dnf remove bluedevil-0:6.2.3-1.fc41.x86_64

Nota: Esse comando deve ser usado com cautela para que não sejam removidos pacotes usados pela sistema.

Comando list

Uso: dnf list [options] [<package-spec>...]

O comando list exibe uma lista de pacotes, que pode ser modificada pelos parâmetros fornecidos.

Opções:
–showduplicates Mostra todas as versões dos pacotes, não só a mais recente.
–installed Lista apenas os pacotes instalados.
–available Lista os pacotes disponíveis.
–extras Lista apenas os extras (aqueles instalados no sistema que não estão disponíveis em nenhum repositório conhecido).
–obsoletes Lista os pacotes instalados no sistema tornados obsoletos por pacotes em outro repositório conhecido.
–recent Lista só pacotes adicionados recentemente aos repositórios.
–upgrades Lista apenas as atualizações disponíveis para os pacotes instalados.
–autoremove Lista os pacotes que serão removidos pelo comando autoremove.
Exemplos de uso:
# para listar pacotes instalados e disponíveis.
$ dnf list

# lista todos os pacotes disponíveis, incluindo todas as versões disponíveis.
$ dnf list --available --showduplicates

# lista pacotes instalados e disponíveis com nome iniciado por kde.
$ dnf list kde*

Comando makecache

Uso: dnf makecache [global options]

makecache é usado para criar e baixar metadados para repositórios habilitados. Sempre que possível ele tenta evitar o download de novos dados, por exemplo, quando os metadados locais ainda não expiraram.

dnf makecache atualiza o cache de metadados DNF local. Não há necessidade de executá-lo manualmente porque o DNF atualiza o cache de metadados automaticamente sempre que for executado. Esse comando é normalmente invocado de forma não interativa, por exemplo por um timer systemd, para manter o cache de metadados atualizado.

Exemplo de uso:
# esvazia o diretório /var/cache/libdnf/
$ sudo dnf clean all

# atualiza /var/cache/libdnf/ com infirmações sobre repositórios
$ sudo dnf makecache

# esvazia os repositórios em /var/cache/libdnf/
$ sudo dnf clean metadata

# esvazia caches de repositórios em /var/cache/libdnf/
$ sudo dnf clean all

Comando mark

Uso: dnf mark <subcommand> [global options] [] <package-spec>...

Quando pacotes são instalados com dnf um “motivo” para a instalação fica armazendo nos metadados do banco de dados. mark altera o motivo para essa instalação. Esse motivo fica definido no argumento package-spec.

Subcomandos:
user Marca o pacote como instalado pelo usuário. Útil se um pacote foi instalado como dependência mas o usuário quer marcá-lo para permanecer no sistema quando o comando remove for usado junto com a opção clean_requirements_on_remove=True.
dependency Marca o pacote como uma dependência. Útil se o usuário precisa de um pacote específico. O pacote permanece instalado no sistema, mas pode ser removido com remove, usado junto com a opção clean_requirements_on_remove=True.
Essa operação deve ser usada no lugar de remove se não há certeza de que pacote não é requisito para outro pacote instalado no sistema por outro usuário.
weak Marca o pacote como uma dependência fraca.
group Marca o pacote como instalado pelo grupo definido no argumento group-id.
Útil se um pacote foi instalado como uma dependência por um usuário, mas espera-se que ele seja protegido e tratado como pertencente a um grupo, pelo comando group remove.
Opções:
–skip-unavailable Permite pular pacotes que não instalados no sistema. Pacotes instalados serão marcados.
Exemplos de uso:
# marca o pacote fuse-devel como instalado pelo usuário
$ dnf mark user fuse-devel

# marca o pacote vim-enhanced como instalado pelo grupo xfce-desktop
$ dnf mark group xfce-desktop vim-enhanced

Comando module

Uso: dnf module <subcommand> [options] [...]

Modularidade é uma forma alternativa de montar, organizar e entregar pacotes. Atualmente, existe apenas suporte básico para gerenciar os módulos, que não recebem mais suporte nas principais distribuições RPM. Mais detalhes em: Modularity e Read The Docs.

Comando offline

Uso: dnf offline <subcommand> [options]

offline é utilizado para gerenciar transações “offline”, que são aquelas executadas quando o sistema é inicializado num ambiente mínimo. Nesse ambiente, rodando um número menor de processos, é mais seguro executar transações pois é menos provável que a transação interfira com os processos em execução.

Transações offline podem ser iniciadas com o “flag” –offline em qualquer operação (install upgrade distro-sync, etc.), ou via dnf system-upgrade download. Depois que uma transação offline é iniciada podemos executar dnf offline reboot para reiniciar o computador e começar a transação. Os dados para transações offline são armazenados no diretório system state, localizado em /usr/lib/sysimage/libdnf/offline.

Subcomandos:
clean Remove transações offline armazenada e exclui arquivos de pacotes em cache.
log Mostra uma lista de inicializações usadas para transações offline, ou mostra logs de transações offline tentadas. Os logs para cada reinicialização podem ser mostrados com a especificação de um dos números na primeira coluna com o argumento –number. Números negativos são usados para listar boots em ordem reversa, começando no último. Por exemplo, log –number=-1 mostra logs da última transação.
reboot Prepara o sistema para executar transações offline e reinicializa para executar a transação. Só pode ser executado após uma transação offline ser iniciada (por exemplo, por dnf system-upgrade download).
status Mostra o status da transação offline atual.
_execute Executa a transação no ambiente offline.
Aviso: apenas para uso interno, não devendo ser executado pelo usuário.
Opções:
–number=<boot number> Mostra o log especificado pelo número. Para ver o número do log execute dnf offline log--number. Usado com o subcomando log.
–poweroff Desliga o sistema após a conclusão da transação, em vez de reiniciar. Se a transação falhar, o sistema será reiniciado em vez de desligar mesmo com esse sinalizador. Usado com o subcomando reboot.
Exemplos de uso:
# prepara a instalação do pacote "hello" como uma transação offline.
$ dnf install --offline hello

# mostra o status da transação offline atual.
$ dnf offline status

# reinicia, executa a transação offline e depois desliga o sistema.
$ dnf offline reboot --poweroff

# Lista os "boots" em que uma transação offline foi tentada.
$ dnf offline log

# Visualiza o log da inicialização mais recente em que uma transação offline foi tentada.
$ dnf offline log --number=-1

Comando provides

Uso: dnf provides [global options] <package-spec>...

provides encontra os pacotes que fornecem o <package-spec>. As especificações podem ser combinadas por nome do arquivo e specs.

Exemplos de uso:
# mostra quais pacotes fornecem o comando tito.
$ dnf provides tito

# mostra quais pacotes fornecem o arquivo /usr/bin/tito
$ dnf provides /usr/bin/tito

# retorna o pacote para rpm e informa se nonexistent_package não retorna resultados.
$ dnf provides rpm nonexistent_package

Nota: Quando nenhum pacote é encontrado por provides, o dnf retorna o código 1 e a lista os recursos que não foram encontrados.

Comando reinstall

Uso: dnf reinstall [global options] <package-spec>...

reinstall é usado para reinstalar pacotes definidos em <package-spec>.

Opções:
–allowerasing Permite remover pacotes instalados para resolver problemas de dependência.
–skip-broken Resolva os problemas de dependência removendo pacotes que causam problemas na transação.
–skip-unavailable Ignora pacotes que não podem ser reinstalaos. Os demais serão reinstalados.
–allow-downgrade Permite o downgrade de dependências para resolver a operação solicitada.
–no-allow-downgrade Desativa o downgrade de dependências ao resolver a operação solicitada.
–downloadonly Baixa o conjunto de pacotes resolvidos sem executar uma transação RPM.
–offline Armazena a transação a ser realizada offline.
Exemplos de uso:
# reinstala o pacote tito.
$ dnf reinstall tito

# reinstala o pacote tito usando arquivo rpm local.
# Útil quando o pacote não está disponível em repositórios habilitados.
$ dnf reinstall ~/Downloads/tito-0.6.21-1.fc36.noarch.rpm

Comando remove

Uso: dnf remove [options] <package-file-spec>|@|@...

remove é usado para remover pacotes, grupos ou ambientes do sistema. Para manter as dependências instaladas junto com o pacote a remover, defina clean_requirements_on_remove = False.

Opções:
–no-autoremove Desativa a remoção de dependências não mais usadas.
–offline Armazena a transação a ser realizada offline.
Exemplos de uso:
# remove o pacote tito.
$ dnf remove tito

Comando replay

Uso: dnf replay [options]

replay permite reexecutar uma transação armazenada no diretório . O diretório de transações pode ser criado com a opção –store, disponível em todos os comandos de transação. A reexecução realizará as mesmas operações sobre pacotes da transação original, retornando erro caso existe diferenças com os pacotes instalados ou suas versões.

Para executar a repetição, o diretório de transações deve conter um arquivo no formato JSON (com o nome transaction.json) descrevendo as operações. O diretório também pode conter pacotes, grupos ou ambientes que serão usados na transação reproduzida.

Opções:
–ignore-extras Não considera como erros pacotes extras baixados pela transação. Eles ainda são relatados como avisos.
–ignore-installed Não considera erros as incompatibilidades entre pacotes de transação instalados e armazenados. Eles ainda serão relatados como avisos.
Em ações de instalação, ignore pacotes já instalados. Em ações de atualização, ignore grupos ou ambientes ainda não instalados.
Em ações de remoção, ignore pacotes/grupos/ambientes não instalados. Essa opção pode levar a transações vazias.
–skip-broken Resolve problemas de dependência removendo pacotes que causam problemas na transação.
–skip-unavailable Ignore pacotes armazenados na transação não disponíveis no sistema de destino, sem gerar mensagem de erro.
Exemplos de uso:
# Reexecuta transação armazenada em ./transaction.
$ dnf replay ./transaction

# Reexecuta transação armazenada em ./transaction ignorando pacotes não disponíveis.
$ dnf replay ./transaction --skip-unavailable

Comando repo

Uso: dnf repo <subcommand> [options] [...]

repo permite diversos tipos de consultas sobre repositórios configurados no sistema.

Subcomandos:
list Lista repositórios disponíveis.
info Mostra informações detalhadas sobre os repositórios.
Opções:
–all Mostra informações sobre todos os repositórios conhecidos.
–enabled Mostra informações apenas sobre repositórios habilitados. (Default).
–disabled Mostra informações apenas sobre repositórios desativados.
Exemplos de uso:
# imprime informações detalhadas sobre todos os repositórios conhecidos.
$ dnf repo info --all

# imprime repositórios desativados relacionados à depuração.
$ dnf repo list --disabled *-debuginfo

# desative persistentemente o repositório usando o plugin config-manger.
$ dnf config-manger setopt repo_id.enabled=0

Comando repoquery

Uso: dnf repoquery [options] [...]

repoquery é usado para consultar pacotes correspondentes a diversos critérios fornecido pelo usuário. Argumentos definidos na lista spec são usados como <package-file-spec>.

Opções:
–advisories=ADVISORY_NAME,… Limita a pacotes em advisory com nome especificado. Esta é uma opção de lista.
Valores esperados são IDs advisory, por exemplo:FEDORA-2201-123.
–advisory-severities=ADVISORY_SEVERITY,… Limita a pacotes em advisory com gravidade definida. Esta é uma opção de lista.
Valores aceitos são:critical, important, moderate, low, none.
–arch=ARCH,… Limita a pacotes das arquiteturas especificadas. Esta é uma opção de lista.
–available Consulta pacotes disponíveis. (Default).
Se combinado com –installed consulta pacotes instalados e disponíveis.
–bugfix Limita a pacotes com avisos de correção de bugs.
–bzs=BUGZILLA_ID,… Limita a pacotes em avisos que corrigem um Bugzilla ID.
Esta é uma opção de lista.
Os valores esperados são IDs numéricos, por exemplo: 123123.
–cves=CVE_ID,… Limita a pacotes em avisos que corrijam um ID CVE (Vulnerabilidades e Exposições Comuns).
Esta é uma opção de lista.
Os valores esperados são IDs de string no formato CVE, por exemplo: CVE-2201-0123.
–disable-modular-filtering Inclui pacotes em módulos inativos.
–duplicates Limita a pacotes instalados e duplicados (ou seja, mais versões de pacotes com o mesmo nome e arquitetura).
Pacotes Installonly são excluídos desse conjunto.
–enhancement Limita a pacotes com avisos de aprimoramento.
–exactdeps Limita a pacotes que requerem <capability> especificados por –whatrequires ou –whatdepends.
Esta opção só pode ser empilhada com –whatrequires ou –whatdepends.
–extras Limita a pacotes instalados que não presentes em nenhum repositório disponível.
–file=FILE,… Limita a pacotes que possuem os arquivos em FILE. Esta é uma opção de lista.
–installed Consulta pacotes instalados. Se combinado com –available consulta pacotes instalados e disponíveis.
–installonly Limita a pacotes installonly instalados.
–latest-limit=N Limita a N pacotes mais recentes para uma arquitetura. Se N < 0 usa todos os pacotes.
–leaves Limita a pacotes leaves (instalados mas não exigidos por outros pacotes instalados).
–newpackage Limita a pacotes em avisos de newpackage.
–providers-of=PACKAGE_ATTRIBUTE Obtem o atributo de pacotes selecionados pelo atributom depois que a filtragem é concluída.
Pacotes resultantes são limitados pelas opções –available –installed –arch.
Tem suporte para: conflicts, depends, enhances, obsoletes, provides, recommends, requires, requires_pre, suggests, supplements.
–recent Limita a pacotes alterados recentemente.
–recursive Opção que pode ser usada com –whatrequires ou –providers-of=requires.
Se usado com –whatrequires, estende a saída com pacotes que exigem qualquer coisa fornecida pelos pacotes de saída.
Se usado com –providers-of=requires: estende a saída com pacotes que fornecem qualquer coisa exigida pelos pacotes de saída.
Os pacotes adicionados são limitados pelas opções –available –installed –arch.
–security Limita a pacotes em avisos de segurança.
–srpm Utiliza pacotes RPMs de origem correspondentes para a saída após a filtragem. Habilita repositórios de origem.
–unneeded Limita a pacotes instalados mas desnecessários (pacotes que foram instalados como dependências, não mais necessários).
Lista pacotes que serão removidos com autoremove.
–upgrades Limita a pacotes disponíveis que atualizam alguns pacotes já instalados.
–userinstalled Limita a pacotes que não marcados como dependências ou como dependências fracas.
Isso limita os pacotes que foram instalados a pedido do usuário ou indiretamente, como parte de um perfil de módulo ou grupo de composições. Também retorna pacotes com motivo desconhecido.
O resultado pode ser influenciado pela opção “exclude” no arquivo de configuração.
Para obter a razão exata da instalação, use a opção –queryformat ‘%{name} %{reason}\n‘.
–whatconflicts=CAPABILITY,… Limita a pacotes em conflito com qualquer um dos listados em <capabilities>. Esta é uma opção de lista.
–whatdepends=CAPABILITY,… Limita a pacotes que requerem, melhoram, recomendam, sugerem ou complementam qualquer um em <capabilities>.
Esta é uma opção de lista.
–whatenhances=CAPABILITY,… Limita a pacotes que melhoram qualquer um dos recursos em <capabilities>. Use –whatdepends para listar todos os pacotes dependentes. Esta é uma opção de lista.
–whatobsoletes=CAPABILITY,… Limita a pacotes que tornem obsoletos qualquer um dos <capabilities>. Esta é uma opção de lista.
–whatprovides=CAPABILITY,… Limita a pacotes que fornecem qualquer uma das <capabilities>. Esta é uma opção de lista.
–whatrecommends=CAPABILITY,… Limite a pacotes que recomendam qualquer um dos <capabilities>. Use –whatdepends para listar todos os pacotes dependentes.
Esta é uma opção de lista.
–whatrequires=CAPABILITY,… Limite a pacotes que requeiram qualquer uma das <capabilities>. Use –whatdepends para listar todos os pacotes dependentes.
Esta é uma opção de lista.
–whatsuggests=CAPABILITY,… Limita a pacotes que sugiram qualquer uma das <capabilities><>. Use –whatdepends para listar todos os pacotes dependentes.
Esta é uma opção de lista.
–whatsupplements=CAPABILITY,… Limita a pacotes que complementem qualquer um dos <capabilities>. Use –whatdepends para listar todos os pacotes dependentes.
Esta é uma opção de lista.

Opções de formatação podem ser usadas para definir quais informações são exibidas sobre cada pacote. Leia mais sobre os comandos de formatação em Read the Docs: Repoquery.

Exemplos de uso:
# listar pacotes que fornecem o arquivo /etc/koji.conf.
$ dnf repoquery /etc/koji.conf

# listar pacotes que contêm o "http" no nome.
$ dnf repoquery *http*

# listar pacotes instalados incluídos em qualquer advisory de segurança.
$ dnf repoquery --installed --security

Comando search

Uso: dnf search [options] <pattern>...

search é usado para pesquisar pacotes em correspondência com palavras-chave fornecida pelo usuário, em vários metadados. Por padrão, o comando procura todas as chaves solicitadas (usando AND) nos campos Name ou Summary dos metadados do pacote RPM. A correspondência é insensível ao caso (maíuscula/minúsculas) e globs são suportados.

Opções:
–all A busca por padrões de pesquisa inclui os campos Description e URL, nos metadados.
Com essa opção, a pesquisa lista os pacotes que correspondem a pelo menos uma das chaves (usando OR).
–showduplicates Mostra todas as versões de pacotes, não apenas as mais recentes.
Exemplos de uso:
# procura a palavra-chave kernel nos campos Name ou Summary dos metadados do pacote.
$ dnf search kernel

# procura pacotes com palavras-chaves rpm e dbus (ambos) nos campos Name ou Summary.
$ dnf search rpm dbus

# procura pacotes com qualquer uma das palavras-chave nos campos Name, Summary, Description ou URL.
$ dnf search --all fedora gnome kde

Comando swap

Uso: dnf swap [options]

swap é usado para remover um pacote e instalar outro em uma única transação.

Opções:
–allowerasing Permite que pacotes instalados sejam removidos para resolver problemas de dependência.
–offline Armazena a transação para execução offline.
Exemplos de uso:
# Remove mlocate e instala plocate.
$ dnf swap mlocate plocate

Comando system-upgrade

Uso: dnf system-upgrade <subcommand> [options]

system-upgrade é usado para atualizar o sistema para uma nova versão. O comando baixa perimeiro os pacotes necessários na sessão ativa. Depois ele emite o subcomando reboot para reiniciar o sistema em ambiente “offline” mínimo para aplicar as atualizações. Essa é uma maneira recomendada para atualizar um sistema para uma nova versão principal. O sistema deve estar atualizado (na versão anterior), o que pode ser obtido com $ dnf --refresh upgrade. system-upgrade compartilha vários subcomandos com offline.

Subcomandos:
clean Idêntico ao subcomando de Offline
download Baixa todos os pacotes necessários para a atualização e verifica se eles podem ser instalados.
log Idêntico ao subcomando de Offline
reboot Idêntico ao subcomando de Offline
Opções:

.

–releasever= Obrigatório, define a versão para atualização. Marca a versão $releasever em todos os repositórios habilitados.
–no-downgrade Funciona como dnf update, não instaland pacotes da nova versão se forem mais antigos do que os já instalados. É o oposto do comportamento default, que sempre instala pacotes da nova versão, mesmo que mais antigos. Funciona como dnf update$ dnf distro-sync.
–number= Idêntico ao subcomando de Offline
–poweroff Idêntico ao subcomando de Offline
Exemplos de uso:
# atualizar sistema e carregar repositórios
$ dnf --refresh upgrade

# atualiza sistema e baixa pacotes da versão 40
$ dnf system-upgrade download --releasever 40

# atualiza e reinicializa sistema
$ dnf system-upgrade reboot

# mostrar logs da última tentativa de atualização
$ dnf system-upgrade log --number=-1

Comando upgrade

Uso: dnf upgrade [options] [<package-spec>|@|@...]

upgrade é usado para atualizar pacotes, grupos ou ambientes para a versão mais recente disponível.

Grupos e ambientes não possuem versões, portanto a atualização basicamente significa uma sincronização com a definição disponível atualmente. A atualização do grupo atualiza todos os pacotes desse grupo, e a atualização do ambiente atualiza todos os grupos contidos nesse ambiente.

Opções:
–minimal Atualiza pacotes para as versões mais baixas disponíveis que corrigem advsories do tipo correção de bugs, aprimoramento, segurança ou newpackage. Se uma opção de limitação de avisos for usada, atualiza os pacotes para as versões mais baixas que corrige avisos correspondentes às propriedades selecionadas
–allowerasing Permite remover pacotes instalados para resolver problemas de dependência.
–skip-unavailable Permite ignorar pacotes não possíveis de atualizar. Os demais pacotes serão atualizados.
–allow-downgrade Habilita o downgrade de dependências para resolver a operação solicitada.
–no-allow-downgrade Desativa o downgrade de dependências para resolver a operação solicitada.
–destdir= Define o diretório usado para baixar pacotes. O default é o diretório atual.
Automaticamente define a opção downloadonly.
–downloadonly Apenas baixa pacotes para transação.
–offline Armazena a transação para execução offline. Veja o comando Offline.
–advisories=ADVISORY_NAME,… Considera apenas o conteúdo contido em avisos com nome especificado.
Esta é uma opção de lista.
Os valores esperados são IDs consultivos, por exemplo. FEDORA-2201-123.
–advisory-severities=ADVISORY_SEVERITY,… Considera apenas o conteúdo contido em avisos com gravidade especificada.
Esta é uma opção de lista.
Os valores aceitos são: critical, important, moderate, low, none.
–bzs=BUGZILLA_ID,… Considera só o conteúdo em avisos que corrigem um ticket de determinado ID do Bugzilla.
Esta é uma opção de lista.
Os valores esperados são IDs numéricos, por exemplo. 123123.
–cves=CVE_ID,… Considera só conteúdo em avisos que corrigem um ticket de determinado ID CVE (Vulnerabilidades e Exposições Comuns).
Esta é uma opção de lista.
Os valores esperados são IDs de string no formato CVE, por exemplo: CVE-2201-0123.
–security Considera só o conteúdo nos avisos de segurança.
–bugfix Considera só o conteúdo nos avisos de correção de bugs.
–enhancement Considera só o conteúdo nos avisos de aprimoramento.
–newpackage Considera só o conteúdo nos avisos do newpackage.
Exemplos de uso:
# atualiza todos os pacotes instalados para a versão mais recente disponível.
$ dnf upgrade

# atualizar o pacote tito.
$ dnf upgrade tito

Comando versionlock

Uso: dnf versionlock <subcommand> <package-spec>...

versionlock recebe uma lista de nomes e versões para pacotes e exclui todas as demais versões desses pacotes. Dessa forma é possível proteger pacotes, impedindo que sejam atualizados para versões mais recentes. Alternativamente, o comando pode recer uma versão de pacote específica a ser excluída das atualizações, por exemplo, para ignorar uma versão específica de um pacote que tenha problemas conhecidos.

O plugin percorre as entradas do arquivo versionlock, excluindo pacotes cujo nome não corresponde às condições listadas. Isso é idêntico a usar dnf –exclude com o próprio nome do pacote (pois não se pode excluir pacotes instalados). No entanto as versões installed ou versionlocked ainda serão vistas como disponíveis pelo dnd, que ainda poderá reinstalar essas versões.

Nota: o comando versionlock não aplica nenhuma exclusão em operações não transacionais, como repoquery, list ou info.

Subcomandos:
add Adicione um versionlock em todos os pacotes disponíveis correspondentes à especificação. Isso significa que apenas pacotes e versões representados em package-spec ficam disponíveis para operações de transação.
exclude Adiciona uma exclusão (dentro do versionlock) para os pacotes correspondentes à especificação. Pacotes representados por package-spec serão excluídos das operações de transação.
clear Remove todas as entradas de versionlock.
delete Remove todas as entradas de versionlock correspondentes.
list Lista as entradas do versionlock.
Exemplos de uso:
# trava a versão do pacote acpi, se estiver instalado, para a versão atual.
# se acpi não estiver instalado, trava a versão do acpipara qualquer uma das versões disponíveis atualmente.
$ dnf versionlock add acpi

# mostra a configuração atual do versionlock.
$ dnf versionlock list

# remove todas as regras para o pacote acpi.
$ dnf versionlock delete acpi

# Exclui a versão iftop-1.2.3-7.fc38.
$ dnf versionlock exclude iftop-1.2.3-7.fc38

Formato de arquivo versionlock: versionlock é um arquivo TOML armazenado em /etc/dnf/versionlock.toml. Ele deve conter uma chave de versão (atualmente a versão suportada é 1.0). Ele também contém uma lista de entradas de bloqueio, em packages. Cada item da lista consiste no nome do pacote e uma lista de condições, que devem ser True para pacotes que correspondem às especificações (usando AND lógico). O conjunto das entradas são combinadas com a operação lógica OR.

Exemplos de arquivos versionlock podem ser vistos em Read the Docs: VersionLock.

Glossário

Especificação de padrões

globs:

Globs são padrões que especificam um comjunto de nomes de arquivos usando caracteres “curingas” ou wildcard. Os padrões aceitos pelo dnf são os mesmos usados pela shell. Os seguintes padrões podem ser usados.

Definições:
* casa com qualquer número de caracteres, ou vazio.
? casa com um caracter único.
[xyz] casa com x, y ou z; qualquer um dos caracteres entre colchetes.
[a-z] casa qualquer um dos caracteres entre a até z, inclusive.
[!a-z] ou [^a-z] não casa com nenhum dos caracteres na faixa de a até z.
{ } colchetes não são suportados.
Exemplos:
*.txt casa com qualquer nome de arquivo que termina com .txt, como “texto.txt”, “aa.txt” ou “.txt”.
su*.css casa com “su.css”, “superman.css” ou “sucata.css”.
?asa.toml casa com qualquer nome de arquivo como “casa.toml”, “rasa.toml” ou “sasa.toml”.
??uga.pdf casa com “aluga.pdf”, “_ruga.pdf” mas não casa com “beluga.pdf”.
[a-m]luga.hlmt casa com “aluga.hlmt”, “gluga.hlmt”, “kluga.hlmt”, mas não com “pluga.hlmt”.
[!1-5]fix.jpg não casa com “3fix.jpg” nem “5fix.jpg”, mas casa com “7fix.jpg”.
[^1-5]fix.jpg o mesmo que acima.

Padrão NEVRA

Pacotes podem ser identificados exclusivamente pela string NEVRA, que consiste de 5 partes de informação:
Name | Epoch | Version | Release | Architecture

São eles: name do pacote (pode conter hifens), Epoch, um número, timestamp, nem sempre incluído, Version string, alfanumérica,Release da versão, Architecture, string definindo arquitetura do alvo.

Packages (Pacotes)

Muitos comandos usam o parâmetro <package-spec> para selecionar pacotes. Esse argumento é comparado com NEVRAs de pacotes, provides e file provides. Quando <package-spec> é um nome de pacote ou um provide, o usuário pode fornecer regras adicionais de restrição para corresponder aos argumentos. Podem ser usadas comparações de versão (com os operadores =, >, <, >=, <=), como este <package-spec>, >= <version>, onde o argumento <version> está em um formato [EPOCH:]VERSION[-RELEASE] conforme especificado acima.

<package-file-spec> é similar a <package-spec>, exceto que provides matching não é executado. Portanto, <package-file-spec> é correspondido somente com NEVRAs e file provides. <package-name-spec> é correspondido somente com NEVRAs.

Bibliografia

DNF5, Resumo Geral

Descrição geral do comando DNF5


Uso:
dnf [Opções Globais] <Comando> ...

Nota: usamos aqui dnf como um aliás para dnf5.

Comandos de gerenciamento de software

Comando Descrição
install Instalar software
upgrade Atualizar software
remove Remover (desinstalar) software
distro-sync Atualizar ou fazer downgrade do software instalado para as últimas versões disponíveis
downgrade Fazer downgrade do software
reinstall Reinstalar software
debuginfo-install Instalar pacotes debuginfo
swap Remover software e instalar outro na mesma transação
mark Alterar o motivo de um pacote instalado
autoremove Remover todos os pacotes instalados como dependências e agora desnecessários
provides Encontre qual pacote fornece o valor fornecido
replay Refazer uma transação anteriormente armazenada em um diretório
check-upgrade Verificar se há atualizações disponíveis para pacotes
check Verifique se há problemas no packagedb

Comandos de consulta

Comando Descrição
leaves Lista grupos de pacotes instalados não necessários para outros pacotes instalados
repoquery Pesquise por pacotes que correspondam a vários critérios
search Pesquise por software que corresponda a todas as strings especificadas
list Lista pacotes dependendo da relação dos pacotes com o sistema
info Lista pacotes dependendo da relação dos pacotes com o sistema

Subcomandos

Subcomando Descrição
group Gerencia grupos de comps
environment Gerencia ambientes de comps
module Gerencia módulos
history Gerencia histórico de transações
repo Gerencia repositórios
advisory Gerencia avisos
versionlock Gerencia configuração de versionlock
system-upgrade Prepara o sistema para atualização para uma nova versão
offline-distrosync Armazena uma transação de distro-sync para ser executada offline
offline-upgrade Armazena uma transação de atualização para ser executada offline
offline Gerencia transações offline
config-manager Gerencia configuração

Comandos

Comando Descrição
clean Remove ou expira dados em cache
download Baixa, sem instalar, o software para o diretório atual
makecache Gera o cache de metadados
builddep Instala dependências de compilação para pacote ou arquivo de especificação
changelog Mostra os changelogs do pacote
copr Gera repositórios Copr (complementos fornecidos por usuários/comunidade/terceiros)
needs-restarting Determina se os serviços do sistema ou systemd precisam ser reiniciados
repoclosure Imprime a lista de dependências não resolvidas para repositórios
build-dep Alias ​​de compatibilidade para ‘builddep’

Opções globais:

Comando Descrição
-h, –help Exibe ajuda
–config=CONFIG_FILE_PATH Localiza o arquivo de configuração
-q, –quiet Junto com comando não interativo mostra só o conteúdo relevante. Suprime notificações sobre o estado atual ou ações do dnf5.
-C, –cacheonly Executa inteiramente com o cache do sistema, mesmo se estiver expirado; não atualiza o cache
–refresh Força a atualização de metadados antes de executar o comando.
–repofrompath=REPO_ID,REPO_PATH cria repositório adicional usando id e caminho
–setopt=[REPO_ID.]OPTION=VALUE define opções arbitrárias de configuração e repositório
–setvar=VAR_NAME=VALUE define variável arbitrária
-y, –assumeyes responde automaticamente sim para todas as perguntas
–assumeno responde automaticamente não para todas as perguntas
–best tenta as melhores versões de pacote disponíveis em transações
–no-best não limita a transação ao melhor candidato
–no-docs Não instala arquivos marcados como documentação (o que inclui páginas de manual e documentos texinfo)
-x pacote,…, –exclude=pacote,… exclui pacotes por nome ou glob
–enable-repo=REPO_ID,… Habilita repositórios adicionais. Opção de lista. Suporta globs, pode ser especificado várias vezes.
–disable-repo=REPO_ID,… Desabilita repositórios. Opção de lista. Suporta globs, pode ser especificado várias vezes.
–repo=REPO_ID,… Habilita apenas repositórios específicos. Opção de lista. Suporta globs, pode ser especificado várias vezes.
–no-gpgchecks desabilita a verificação de assinatura gpg (se a política RPM permitir)
–no-plugins Desabilita todos os plugins libdnf5
–enable-plugin=PLUGIN_NAME,… Habilita plugins libdnf5 por nome. Opção de lista. Suporta globs, pode ser especificado várias vezes.
–disable-plugin=PLUGIN_NAME,… Desabilita plugins libdnf5 por nome. Opção de lista. Suporta globs, pode ser especificado várias vezes.
–comment=COMMENT adiciona um comentário à transação
–installroot=ABSOLUTE_PATH define raiz de instalação
–use-host-config usa configuração, reposdir e vars do sistema host em vez do installroot
–releasever=RELEASEVER substitui o valor de $releasever em arquivos de configuração e repositório
–show-new-leaves Mostra pacotes leaf recém-instalados e pacotes que se tornaram leaves após uma transação.
–debugsolver Despeja resultados detalhados de resolução em arquivos
–dump-main-config Imprime valores de configuração principais no stdout
–dump-repo-config=REPO_ID,… Imprime valores de configuração do repositório no stdout. Opção de lista. Suporta globs
–dump-variables Imprime valores de variáveis ​​no stdout
–version Mostra a versão DNF5 e sai
–forcearch=FORCEARCH Força o uso de uma arquitetura diferente.

Aliases

A primeira coluna é uma lista de aliases de compatibilidade com o dnf4. A segunda coluna mostra aliases de opções:

Alias Substitui
check-update check-upgrade
dg downgrade
dsync distro-sync
grp group
if info
in install
ls list
mc makecache
rei reinstall
repoinfo repoinfo
repolist repolist
rm remove
rq repoquery
se search
up upgrade
update upgrade
updateinfo advisory
upgrade-minimal upgrade–minimal
Alias Substitui
-c CONFIG_FILE_PATH –config
–nobest –no-best
–nodocs –no-docs
–enablerepo=REPO_ID,… –enable-repo
–disablerepo=REPO_ID,… disable–repo
–repoid=REPO_ID,… –repo
–nogpgcheck –no-gpgchecks
–noplugins –no-plugins
–enableplugin=PLUGIN_NAME,… –enable-plugin
–disableplugin=PLUGIN_NAME,… –disable-plugin

Bibliografia

Flet: CircleAvatar, CupertinoActivityIndicator, Icon


Controle CircleAvatar

O controle CircleAvatar desenha um círculo que pode conter imagens, ícones ou texto. Geralmente é usado para representar o avatar de um usuário. Um texto alternativo pode ser usado para exibição caso a imagem declarada não esteja acessível.

Propriedades e evento de CircleAvatar

As seguintes propriedades e evento existem no controle CircleAvatar:

Descrição
background_image_src recurso de imagem (local ou URL) a ser renderizado no fundo do círculo. Se essa imagem é alterada uma animação será mostrada na troca de imagens. Alterar a imagem de fundo fará com que o avatar anime para a nova imagem. Essa imagem serve como fallback para foreground_image_src. Caso as iniciais do usuário devem ser exibidas (ou qualquer outro texto curto), informe a imagem na propriedade content.
bgcolor cor de fundo do círculo. Alteração na cor provocará uma animação no avatar para a nova cor.
color cor do texto padrão. Default O padrão é a cor do tema de texto primário se a cor de fundo não for especificada.
content normalmente, um controle de texto. Para apresentar uma imagem em CircleAvatar use background_image_src.
foreground_image_src A fonte (arquivo de ativo local ou URL) da imagem de primeiro plano no círculo. Normalmente usada como imagem de perfil. Para fallback, use background_image_src.
max_radius O tamanho máximo do avatar, expresso como o raio (metade do diâmetro). Se maxRadius for especificado, o raio também não deve ser especificado. O padrão é “infinito”.
min_radius O tamanho mínimo do avatar, expresso como o raio (metade do diâmetro). Se minRadius for especificado, o raio não deve ser especificado também. O padrão é zero.
radius O tamanho do avatar, expresso como o raio (metade do diâmetro). Se radius for especificado, nem minRadius nem maxRadius podem ser especificados.
tooltip O texto exibido ao passar o mouse sobre o botão.
Evento Descrição
on_image_error dispara quando ocorre um erro ao carregar imagens em background_image_src ou foreground_image_src.
Os evento tem a propriedade e.data que contém uma string com valor “background” ou “foreground”, indicando a origem do erro.

Exemplo de uso do CircleAvatar

import flet as ft

def main(page):
    page.bgcolor=ft.colors.WHITE
    foto="https://phylos.net/wp-content/uploads/2017/12/GuilhermeRoundPequeno.png"
    ico=ft.Icon(ft.icons.BEDROOM_BABY)

    a1 = ft.CircleAvatar(foreground_image_src=foto, content=ft.Text("autor"))

    a2 = ft.Stack([a1, ft.CircleAvatar(bgcolor="green", radius=7)], width=40, height=40)

    a3 = ft.CircleAvatar(content=ico, bgcolor="red", color="black")

    a4 = ft.CircleAvatar(content=ico, color="red", bgcolor="black")

    a5 = ft.CircleAvatar(content=ft.Text("@", size=20))

    page.add(ft.Row([a1, a2, a3, a4, a5]))

ft.app(target=main)
Figura 1: resultado do código de CircleAvatar

Os controles CircleAvatar nesse código são:

  • a1: um avatar comum com imagem de fundo,
  • a2: um avatar com círculo de status,
  • a3: um avatar avatar com ícon, e cores customizadas,
  • a4: um avatar avatar com ícon, e cores customizadas invertidas, e
  • a5: um avatar com imagem de fundo e texto fallback.

Controle CupertinoActivityIndicator

O controle CupertinoActivityIndicator é uma imagem indicadora de atividade no estilo Cupertino (iOS) que pode ou não ser animado. Se animado a imagem gira no sentido horário.

Propriedades de CupertinoActivityIndicator

Descrição
animating booleano, default=True. Se o indicador deve ser animado.
color a cor do indicator
radius raio do indicador de atividade (tamanho).

Exemplo de uso do CupertinoActivityIndicator

import flet as ft

def main(page):
    page.bgcolor=ft.colors.WHITE

    act0=ft.CupertinoActivityIndicator(radius=20, color=ft.colors.GREEN, animating=True)
    act1=ft.CupertinoActivityIndicator(radius=50, color=ft.colors.BLUE, animating=True)
    act2=ft.CupertinoActivityIndicator(radius=30, color=ft.colors.RED)

    page.add(ft.Row([act0, act1, act2]))

ft.app(target=main)
Figura 2: resultado do código de ActivityIndicator

Controle Icon

O controle Icon desenha um ícone no estilo Material na página do aplicativo.

Uma página interativa na web pode ser usada para buscar nomes dos ícones desejados, em Flet: Icons Browser.

Propriedades de Icon

Propriedade Descrição
color cor do ícone.
name nome do ícone.
semantics_label nome semântico do ícone. Não é exibido na página mas pode ser acionado em modos de acessibilidade.
size tamanho do ícone. Defaul = 24.
tooltip texto da “dica”, exibido com a passar do mouse (hovering).

Exemplo de uso do Controle Icon

import flet as ft

def main(page: ft.Page):
    page.theme_mode = ft.ThemeMode.LIGHT

    def cor_original():
        ico1.color=ft.colors.PINK
        ico2.color=ft.colors.YELLOW
        ico3.color=ft.colors.GREEN
        ico4.color=ft.colors.BLUE

    def mudar_cor(e):
        if ico1.color==ft.colors.PINK:
            arr_Icons=page.controls[0].controls
            for i in arr_Icons:
                i.color=ft.colors.GREY
        else:
            cor_original()
        page.update()

    def tamanho(e):
        arr_Icons=page.controls[0].controls
        for i in arr_Icons:
            i.size+=5
        page.update()

    ico1=ft.Icon(name=ft.icons.SD_CARD, size=15)
    ico2=ft.Icon(name="sd_card", size=15)
    ico3=ft.Icon(name=ft.icons.ANCHOR, size=30)
    ico4=ft.Icon(name=ft.icons.ELECTRIC_CAR, size=50)
    cor_original()
    bt_cor=ft.ElevatedButton("Mudar Cor", icon="arrow", on_click=mudar_cor, width=150)
    bt_tamanho=ft.ElevatedButton("Tamanho", icon="arrow", on_click=tamanho, width=150)

    page.add(ft.Row([ico1, ico2, ico3, ico4]), ft.Row([bt_cor, bt_tamanho]))

ft.app(target=main)
Figura 3: resultado do código de exemplo de Icon

A figura 3 mostra o resultado do código. A Figura 3-A é o estado inicial do aplicativo. Figura 3-B é o estado após 5 cliques no botão “Tamanho”. O  botão “Muda Cor” alterna entre as cores originais e um tom de cinza, para todos os ícones.

Um comentário pode ser útil aqui: como a propriedade de cores dos ícones é usada mais de uma vez, é interessante atribuir essas propriedades em um mesmo bloco de código, o que é feito na função cor_original().

Percorrer todos os ícones para mudar de tamanho ou atribuir a cor cinza foi feita da seguinte forma: foram capturados todos os ícones em um array arr_Icons. Observe que:

  • page.controls[] é uma lista com 2 linhas,
  • page.controls[0] é a primeira linha da lista,
  • page.controls[0].controls é lista de ícones existentes na 1a linha,
  • page.controls[0].controls[i] é cada um dos ícones, (i=0,1, 2, 3),
  • page.controls[0].controls[i].size é o tamanho de cada ícone, e
  • page.controls[0].controls[i].color é a cor de cada ícone.

Flet, Exemplos: Controles Badge e Canvas

Exemplos: Badge e Canvas

Exemplo 1: uso do Controle Badge

import flet as ft

def main(page: ft.Page):

    def clicou(e):
        badge.text=str(int(badge.text)+1)
        page.update()

    badge=ft.Badge(
        text="1",
        content=ft.Icon(ft.icons.PHONE, size=40),
        bgcolor="#ff0000",
        text_color="#000000",
    )

    page.navigation_bar = ft.NavigationBar(
        destinations=[ft.NavigationBarDestination(icon_content=badge, label="Soma Um")],
        on_change=clicou
    )
    page.add()

ft.app(main)
Figura 1

A figura 1-A mostra o estado inicial do Badge e 1-B mostra o estado final, após 4 cliques sobre o controle.

Exemplo 2: uso do Canvas.Shapes

O exemplo abaixo mostra casos simples de uso de Color, Circle, Arc, Rect e Line.

import flet as ft
import flet.canvas as cv
import math

def main(page: ft.Page):
    risco = ft.Paint(stroke_width=2, style=ft.PaintingStyle.STROKE)
    pintar = ft.Paint(style=ft.PaintingStyle.FILL)
    cnv = cv.Canvas(
        [
            cv.Color(ft.colors.GREEN_50),                             # A
            cv.Circle(100, 100, 40, risco),                           # B
            cv.Circle(100, 100, 30, risco),                           # C
            cv.Circle(100, 100, 10, pintar),                          # D
            cv.Arc(180, 90, 60, 40, 0, 2*math.pi, paint=risco),       # E
            cv.Arc(180, 80, 60, 20, math.pi, math.pi, paint=risco),   # F
            cv.Rect(165, 60, 90, 80, 15, risco),                      # G
            cv.Line(280, 70, 340, 130, risco),                        # H
            cv.Line(280, 130, 340, 70, risco),                        # I
            cv.Oval(267, 70, 90, 60, risco)                           # J
        ],
    )
    page.add(cnv)

ft.app(main)
Figura 2: representação das curvas marcadas no código

Exemplo 3: uso do Canvas.Path, LineTo, MoveTo

O exemplo abaixo mostra casos simples de uso de Paint, Path, MoveTo, LineTo e Close.

import flet as ft
import flet.canvas as cv
import math

def main(page: ft.Page):
    page.bgcolor=ft.colors.AMBER_100

    def mudar(e):
        caminho1.paint=preenche if caminho1.paint==risco else risco
        caminho2.paint=preenche if caminho2.paint==risco else risco
        caminho1.update()
        caminho2.update()

    risco=ft.Paint(stroke_width=2, style=ft.PaintingStyle.STROKE)
    preenche=ft.Paint(style=ft.PaintingStyle.FILL)
    caminho1=cv.Path(
        [
            cv.Path.MoveTo(25, 25),
            cv.Path.LineTo(105, 25),
            cv.Path.LineTo(25, 105),
            cv.Path.Close()
        ],
        paint=risco
    )
    caminho2=cv.Path(
        [
            cv.Path.MoveTo(125, 125),
            cv.Path.LineTo(125, 45),
            cv.Path.LineTo(45, 125),
            cv.Path.Close()
        ],
        paint=preenche
    )
    page.add(
        ft.ElevatedButton("Mudar estilo de Paint", on_click=mudar),
        cv.Canvas([caminho1, caminho2])
    )
ft.app(main)
Figura 3: Estado inicial e após um clique

Exemplo 3: uso do Canvas.Circle, Rect

O exemplo abaixo mostra casos simples de uso de canvas.Circle, canvas.Rect, canvas.Path, canvas.Path.MoveTo, canvas.QuadraticTo e rotações.

import flet as ft
import flet.canvas as cv

def main(page: ft.Page):
    page.bgcolor=ft.colors.GREEN_200

    gr1=ft.PaintRadialGradient((60, 90), 50, colors=[ft.colors.YELLOW, ft.colors.BLUE])
    grad1=ft.Paint(gradient=gr1, style=ft.PaintingStyle.FILL)
    gr2=ft.PaintRadialGradient((250, 90), 50, colors=[ft.colors.BLACK, ft.colors.RED])
    grad2=ft.Paint(gradient=gr2, style=ft.PaintingStyle.FILL)
    risco=ft.Paint(stroke_width=4, style=ft.PaintingStyle.STROKE)

    fig1=cv.Circle(60, 90, 50, grad1)
    fig2=cv.Path([cv.Path.MoveTo(110, 130), cv.Path.QuadraticTo(160, 1, 210, 130, 1)], paint=risco)
    fig3=cv.Rect(230, 50, 70, 60, 1, grad2)
    fig4=cv.Rect(240, 60, 70, 60, 1, risco)

    page.add(cv.Canvas([fig1,fig2, fig3, fig4]))

ft.app(main)
Figura 4: Curvas no código

Exemplo 5: uso do Canvas.Text

O exemplo abaixo mostra casos simples de uso de canvas.Text, estilos e rotações.

import flet as ft, flet.canvas as cv, math

def main(page: ft.Page):
    page.bgcolor=ft.colors.WHITE

    estilo1=ft.TextStyle(weight=ft.FontWeight.BOLD, color=ft.colors.GREEN, size=40)
    estilo2=ft.TextStyle(weight=ft.FontWeight.BOLD, color=ft.colors.RED, size=30)

    texto1=cv.Text(0, 0, "Um texto comum", ft.TextStyle(color=ft.colors.BLUE, size=30))
    texto2=cv.Text(180, 100, "Um texto", estilo1, alignment=ft.alignment.top_center, rotate=math.pi/4)
    texto3=cv.Text(130, 140, "rotacionado", estilo2, alignment=ft.alignment.top_center, rotate=math.pi/4)

    page.add(cv.Canvas([texto1, texto2, texto3]))

ft.app(main)
Figura 5: texto rotacionado de Canvas

Exemplo 5: uso do Canvas.Point

O código do próximo exemplo coleta pares de pontos em duas listas, representando seno e cosseno mas as mesmas amplitudes e diferentes comprimentos de onda. As duas listas são representados por meio do canvas.Points.

import flet as ft, flet.canvas as cv, math

def main(page: ft.Page):
    page.bgcolor=ft.colors.WHITE
    risco1=ft.Paint(stroke_width=2, style=ft.PaintingStyle.STROKE, color=ft.colors.BLUE_ACCENT)
    risco2=ft.Paint(stroke_width=2, style=ft.PaintingStyle.STROKE, color=ft.colors.RED)

    seno1=[]
    seno2=[]
    for x in range(500):
        seno1.append((x,50+50*math.sin(.05*x)))
        seno2.append((x,50+50*math.cos(.5*x)))

    cnv=cv.Canvas(
        [
            cv.Points(points=seno1, paint=risco1, point_mode=cv.PointMode.POLYGON),
            cv.Points(points=seno2, paint=risco2, point_mode=cv.PointMode.POLYGON)
        ]
    )
    page.add(cnv)

ft.app(main)
Figura 6: Canvas.Point

Flet: Badge e Canvas

Controle Badge

O controle Badge (um distintivo ou emblema) é uma marca posta acima de outro controle, usada ​​para mostrar notificações, contagens ou informações de status sobre o aplicativo. O controle que recebe um Badge é normalmente um ícone, parte de um NavigationBar ou um destino de NavigationRail, ou um ícone de botão. O controle tem a propriedade text onde as informações podem ser exibidas. Se text é fornecido, o rótulo será um emblema em forma de StadiumBorder com altura large_size. Se nenhum texto for fornecido, o emblema será exibido como um círculo preenchido de diâmetro small_size.

Propriedades de Badge

As seguintes propriedades existem no controle Badge:

Propriedade Descrição
alignment alinhamento do label em relação ao conteúdo do controle. Este valor só é usado se a propriedade text for especificada. Por exemplo: badge.alignment = ft.alignment.top_left. O valor é do tipo Alignment.
bgcolor cor de fundo do label.
content um controle filho contido pelo Badge, normalmente um ícone parte de um destino de NavigationBar ou NavigationRail. O valor é do tipo Control.
label_visible booleano, default True. Se label_visible=False, o Badge não é exibido.
large_size altura do Badge se nenhum text for fornecido. O valor é do tipo OptionalNumber com default 16.
offset combinado com o alinhamento para determinar a localização do Badge. Só tem efeito se text for fornecido. O valor é do tipo OffsetValue.
padding preenchimento aplicado ao label. Esse valor só é usado se text for fornecido. O padrão é 4 pixels à esquerda e à direita. O valor é do tipo PaddingValue.
small_size O diâmetro do label se o text não for fornecido. O valor é do tipo OptionalNumber com default 6.
text texto mostrado no label, normalmente de 1 a 4 caracteres. Se o text for fornecido, o label terá a forma de StadiumBorder com altura igual a large_size. Se não for fornecido, o emblema será exibido como um disco diâmetro small_size. O valor é do tipo string.
text_color cor do texto no label. Substitui a cor especificada em text_style.
text_style estilo usado para texto em label. O valor é do tipo TextStyle.

Você pode ver um exemplo de uso do controle Bagde.

Controle Canvas

O controle Canvas serve para que sejam desenhados gráficos arbitrários, usando um conjunto de formas primitivas como line, arc, path e text, respectivamente linha, arco, caminho, e texto.

Propriedades do Canvas

As seguintes propriedades estão definidas do controle Canvas:

Propriedade Descrição
resize_interval intervalo de amostragem (em milissegundos) para coleta do evento on_resize. O default é 0 (on_resize ocorre imediatamente após a alteração).
shapes lista de objetos Shape (listados abaixo) a serem desenhados no canvas.

Evento do Canvas

O seguinte evento pode ser acionado no Canvas:

Evento Descrição
on_resize dispara quando o tamanho do canvas é alterado. O objeto de evento e é uma instância de CanvasResizeEvent.

Propriedades das Formas (Shapes)

Nesse contexto chamamos as Shapes de formas, Path de caminhos, as partes de um caminho de subcaminhos.

As formas básicas (Shapes) usadas pelo Canvas são: Arc, Circle, Color, Fill, Line, Oval, Path, Points, Rect, Shadow, Text, respectivamente: Arco, círculo, cor, preenchimento, linha, oval, caminho, ponto, retângulo, sombra, texto.

Propriedades de Arc

Um Arc é o elemento que desenha um arco dimensionado para caber dentro do retângulo disponível. O arco vai no sentido horário de start_angle até start_angle + sweep_angle (em radianos, com zero mostrado na figura 2). Se use_center=True, o arco é fechado de volta ao centro. Caso contrário, o arco fica aberto.

Figura 2

Uso: canvas.Arc(x, y, width, height, start_angle, sweep_angle, use_center, paint)

height altura do retângulo que contém o arco.
paint estilo de desenho do arco. O valor é uma instância da classe Paint.
start_angle ângulo inicial (em radianos) no desenho do arco. Veja figura.
sweep_angle acréscimo sobre o ângulo inicial (em radianos) no desenho do arco. Veja figura.
use_center se use_center=True o arco será fechado de volta ao centro. Caso contrário, o arco fica aberto.
width largura do retângulo que contém o arco.
x, y coordenadas (x,y) do ponto superior esquerdo do arco.
Propriedades de Circle

Um Circle desenha um círculo dentro do canvas.
Uso: canvas.Circle(x,y,radius, paint)

paint estilo de desenho do círculo. O valor é instância da classe Paint.
radius raio do círculo.
x, y coordenadas do centro do círculo.
Propriedades de Color

Color pinta uma cor na tela, usando o blend_mode fornecido. A cor fornecida é a origem e o fundo o destino.
Uso: canvas.Color(color, blend_mode)

blend_mode modo de mesclagem a ser aplicado. O valor é do tipo BlendMode.
color cor usada para pintar a tela.
Propriedades de Fill

Um Fill preenche a tela com o Paint dado (definido abaixo). Para preencher a tela com cor sólida e modo de mesclagem, considere usar forma Color.
Uso: canvas.Fill(paint)

paint estilo de preenchimento da tela. O valor é instância da classe Paint.
Propriedades de Line

Line desenha uma linha entre os pontos dados usando paint. A linha é traçada e o valor do Paint.style é ignorado.
Uso: canvas.Line(x1, y1, x2, y2, paint)

paint estilo de desenho da linha. O valor é instância da classe Paint.
x1, y1 coordenadas (x, y) do ponto inicial da linha.
x2, y2 coordenadas (x, y) do ponto final da linha.
Propriedades de Oval

Oval desenha uma figura oval (uma elipse) usando o Paint dado. A oval pode ser preenchida ou traçada (ou ambos), o que é controlado por Paint.style.

Uso: canvas.Oval(x, y, width, height, paint)

height altura do retângulo contendo a oval.
paint estilo para desenhar uma oval. O valor é instância da classe Paint.
width largura do retângulo contendo a oval.
x, y coordenadas (x, y) do ponto superior esquerdo da oval.
Propriedades de Path

Path desenha um caminho com elementos fornecidos por Paint. A forma pode ser preenchida ou traçada (ou ambos), e isso é controlado por Paint.style. Se Path for preenchido, os subcaminhos serão implicitamente fechados (veja Path.Close).
Uso: canvas.Path(elements, paint)

elements lista de elementos do caminho. Os elementos possíveis estão listados abaixo.
paint estilo para desenhar o caminho. O valor é instância da classe Paint.
Elementos de Path

A tabela abaixo lista os possíveis elementos de Path:

Path.MoveTo(x, y) inicia um novo subcaminho no ponto (x,y).
Path.LineTo(x, y) adiciona um segmento de reta do ponto atual ao ponto (x,y) dado.
Path.QuadraticTo(cp1x, cp2y, x, y, w) adiciona um segmento bezier do ponto atual até (x,y) dado, usando os pontos de controle (cp1x,cp1y). O peso w define o tipo de curva: se w> 1, hipérbole; w = 1, parábola; w < 1, elipse.
Path.CubicTo(cp1x, cp1y, cp2x, cp2y, x, y) adiciona um segmento cúbico bezier do ponto atual para (x,y), usando os pontos de controle (cp1x,cp1y) e (cp2x,cp2y).
Path.SubPath(elements, x, y) adiciona subcaminho descrito por elements até (x,y).
Path.Arc(x, y, width, height, start_angle, sweep_angle) adiciona subcaminho com um segmento de arco que segue a borda do oval delimitado por um retângulo. O retângulo tem canto superior esquerdo em (x, y) e dimensões width e height. O arco vai de start_angle radianos até start_angle + sweep_angle, crescendo no sentido horário.
Path.ArcTo(x, y, radius, rotation, large_arc, clockwise) adiciona até quatro curvas cônicas ponderadas. radius é o raio; rotation a rotação dos eixos (em graus e sentido horário). A primeira curva começa no ponto atual, e a última termina em (x, y). O sentido do arco é definido por clockwise e large_arc. clockwise=True é sentido horário e o ângulo de varredura é sempre menor que 360 ​​graus. Uma linha simples é acrescentada se radius=0.
Path.Oval(x, y, width, height) adiciona um novo subcaminho que consiste em uma curva que forma a elipse que preenche o retângulo fornecido.
Path.Rect(x, y, width, height, border_radius) adiciona um retângulo como um novo subcaminho.
Path.Close fecha o último subcaminho, ligando o ponto atual até o primeiro ponto do subcaminho.

Nota: †: Uma curva de Bezier é uma curva parametrizada que representa a interpolação linear entre os chamados pontos de controle. Normalmente, ela tem como objetivo aproximar uma forma que não tem representação matemática explícita ou com representação desconhecida ou complicada. Ela é usada principalmente em aplicações gráficas computadorizadas.

Figura 3: curva de Bezier
Propriedades de Points

Points é o elemento que desenha uma sequência de pontos de acordo com o point_mode dado.

paint estilo para desenhar pontos. O valor é instância da classe Paint.
points lista de ft.Offset descrevendo pontos.
point_mode define como a lista de pontos é interpretada ao desenhar um conjunto de pontos. O valor é do tipo PointMode.
Propriedades de Rect

Rect desenha um retângulo.

Uso: canvas.Rect(x, y, width, height, border_radius, paint)

border_radius raio da borda do retângulo. O valor é do tipo BorderRadius.
height altura do retângulo.
paint estilo para desenhar o retângulo. O valor é a instância da classe Paint.
width largura do retângulo.
x, y coordenadas (x,y) do ponto superior esquerdo do retângulo.
Propriedades de Shadow

Desenha uma sombra sob um caminho, representada com uma elevação elevation.

Uso: canvas.Shadow(color, elevation, path, transparent_occluder)

color cor da sombra.
elevation elevação da sombra.
path lista de objetos Path.PathElement que descrevem o caminho.
transparent_occluder True se o objeto oclusivo não for opaco. Default é False.
Propriedades de Text

Text renderiza elemento de texto com style dado no ponto (x, y).

Uso: canvas.Text(x, y, text, alignment, rotate)

alignment ponto dentro de um retângulo de texto que define sua posição e centro de rotação. O valor é do tipo Alignment e o default é align.top_left.
ellipsis String que define elipsis (três pontos: ) usados em texto maiores que o espaço disponível.
max_lines número máximo de linhas exibidas. Além desse número as linhas são silenciosamente descartadas. Ex.: se max_lines = 1, só uma linha é renderizada. Se max_lines = None e ellipsis != None as linhas que seguem a primeira a ultrapassar as restrições de largura são descartadas.
max_width largura máxima do texto renderizado. Default None (infinito).
rotate rotação do texto em radianos, em torno do ponto determinado pelo alinhamento.
spans lista de objetos TextSpan para criar um parágrafo de rich text.
style estilo de texto para rederizar text e spans. O valor é instância da classe TextStyle.
text texto a ser exibido.
text_align alinhamento horizontal do texto. O valor é do tipo TextAlign com default TextAlign.LEFT.
x, y coordenadas (x,y) do ponto de alinhamento do texto.

Flet: NavigationDrawer

Controle NavigationDrawer

O controle NavigationDrawer é um componente no estilo Material Design que desenha um painel similar ao NavigationBar mas que desliza horizontalmente da borda, da esquerda para a direita ou o inverso. Ela serve para apresentar destinos primários em um aplicativo. Uma NavigationDrawer é adicionada e removida da página com as propriedades page.drawer e page.end_drawer. Um controle NavigationDrawer pode ser adicionado a uma View, usando as propriedades View.drawer ou View.end_drawer.

Nesse texto chamaremos a drawer (literalmente, gaveta) de aba. Portanto o controle de navegação contem diversos controles de destinos que são abas.

Propriedades do NavigationDrawer

Propriedade Descrição
bgcolor cor de fundo do controle.
controls lista de itens de menu que são os filhos do NavigationDrawer. Esses filhos são controles NavigationDrawerDestination ou alguns outros, como títulos e divisores.
elevation elevação do controle.
indicator_color cor do indicador de destino selecionado.
indicador_shape forma do indicador de destino selecionado. O valor é do tipo OutlinedBorder.
position posição dessa aba. O valor é do tipo NavigationDrawerPosition com default NavigationDrawerPosition.START.
selected_index índice do NavigationDrawerDestination selecionado, ou nulo se nenhuma seleção foi feita.Se esse número for inválido (como -1), nenhum destino será selecionado.
shadow_color cor da sombra usada para indicar elevação.
surface_tint_color tom de cor da superfície (Material) que abriga o conteúdo do NavigationDrawer.
tile_padding preenchimento para controles NavigationDrawerDestination.

Eventos do NavigationDrawer

Evento Descrição
on_change dispara na seleção de um destino.
on_dismiss dispara quando a aba é descartada por ação de alhum outro controle ou clique fora da aba.

Uma NavigationDrawer recebe outros controles em sua propriedade NavigationDrawer.controls, que é um array. Em particular vários controles NavigationDrawerDestination podem ser inseridos, contendo ícones e labels. A seleção dos destinos é realizada no evento NavigationDrawer.on_change e a captura do índice do controlel clicado. Um evento também é disparado no fechamento da aba, com NavigationDrawer.on_change.

Propriedades de NavigationDrawerDestination

Propriedade Descrição
bgcolor cor do controle de destino.
icon ícone do destino.
icon_content controle dentro do ícone de destino. Geralmente é um controle Icon e é usado no lugar da propriedade icon.
Se um selected_icon_content for fornecido ele só será exibido se o destino não for selecionado.
label rótulo de texto abaixo do ícone deste NavigationDrawerDestination.
selected_icon ícone alternativo exibido quando o destino é selecionado.
selected_icon_content controle de ícone alternativo exibido quando o destino é selecionado. Se este ícone não for fornecido, o NavigationDrawer exibe icon_content em qualquer estado.

† Nota: O manual do Flet sugere a escolha de um ícone com uma versão com traço e preenchida, como icons.CLOUD e icons.CLOUD_QUEUE, para tornar o NavigationDrawer mais acessível. O ícone deve ser definido para a versão com traço e selected_icon para a versão preenchida.

Exemplo de Uso do NavigationDrawer

import flet as ft

def main(page: ft.Page):
    page.bgcolor=ft.colors.BLUE_500

    def fechar_painel(e):
        mensagem.value+="\nAba dispensada"
        page.update()

    def clicar_destino(e):
        mensagem.value+=f"\nFoi selecionado o índice: {e.control.selected_index}"
        if e.control.selected_index==3:
            page.close(aba)
        page.update()

    aba=ft.NavigationDrawer(
        bgcolor=ft.colors.BLUE_600,
        on_dismiss=fechar_painel,
        on_change=clicar_destino,
        controls=[
            ft.Container(height=12),
            ft.NavigationDrawerDestination(
                label="Item 1",
                icon=ft.icons.AIRPLANEMODE_ON,
                selected_icon_content=ft.Icon(ft.icons.AIRPLANEMODE_INACTIVE),
            ),
            ft.NavigationDrawerDestination(
                icon_content=ft.Icon(ft.icons.AIRPLANE_TICKET),
                label="Item 2",
                selected_icon=ft.icons.AIRPLANE_TICKET_OUTLINED,
            ),
            ft.NavigationDrawerDestination(
                icon_content=ft.Icon(ft.icons.AIRPORT_SHUTTLE),
                label="Item 3",
                selected_icon=ft.icons.DEBLUR_SHARP,
            ),
            ft.Divider(thickness=2),
            ft.NavigationDrawerDestination(
                icon_content=ft.Icon(ft.icons.CHALET),
                label="Fechar Aba",
                selected_icon=ft.icons.PHONE,
            ),
            ft.NavigationDrawerDestination(
                label="Feche a aba clicando no ícone\n ou fora da aba"
            ),
        ],
    )
    mensagem=ft.Text("Suas ações serão vistas aqui:\n", color=ft.colors.BLACK)
    centro=ft.Container(
        content=mensagem,
        margin = ft.margin.only(left=300, top=0, right=0, bottom=0),
        padding=30,
        width=300,
        height=230,
        border_radius=10,
        bgcolor=ft.colors.AMBER_100,
    )
    page.add(
        ft.ElevatedButton("Exibir drawer", on_click=lambda e: page.open(aba)),
        centro
    )

ft.app(main)

A figura 1 mostra o estado do aplicativo em execução. 1 (A) é o estado inicial, antes de qualquer ação do usuário. 1 (B) exibe a aba após o clique sobre Exibir drawer. 1 (C) é o estado após um clique sobre os três itens, seguido do clique sobre Fechar Aba ou em qualquer ponto da página fora da aba.

Flet: NavigationBar


Controle NavigationBar

NavigationBar é um componente da barra de navegação no estilo Material 3. Barras de navegação são dispostas ao fundo da página do aplicativo e podem conter diversos controles de seleção, chamados NavigationBarDestination que podem ser selecionados com um clique. Essa é uma forma conveniente de alternar entre destinos em um aplicativo.

Propriedades de NavigationBar

As seguintes propriedades estão definidas para o controle NavigationBar:

Propriedade Descrição
adaptive booleano, default False. Se adaptive=True uma barra adaptável será criada. No iOS/MacOS uma CupertinoNavigationBar é criada, com funcionalidade e apresentação correspondentes ao padrão do iOS. Em outras plataformas a barra tem a apresentação do estilo Material.
animation_duration tempo de transição para os ícones de destino para mudar de selecionado para não selecionado.
bgcolor cor da barra de navegação.
destinations define os botões dispostos dentro da barra de navegação, inclusive sua aparência. Deve ser uma lista de duas ou mais
instâncias de NavigationBarDestination.
elevation elevação da barra de navegação.
indicator_color cor do indicador de destino selecionado.
indicator_shape formato do indicador de destino selecionado. O valor é do tipo OutlinedBorder.
label_behavior define a disposição dos rótulos de destinos e quando serão exibidos.É possível exibir ou ocultar todos os rótulos, ou mostrar apenas aquele selecionado. O valor é do tipo NavigationBarLabelBehavior e o padrão é NavigationBarLabelBehavior.ALWAYS_SHOW (sempre exibido).
overlay_color cor de destaque do NavigationDestination em vários estados ControlState. Os seguintes valores de ControlState são suportados: PRESSED, HOVERED e FOCUSED.
selected_index índice do destino selecionado (o último NavigationBarDestination selecionado), ou None se nenhum destino foi selecionado.
shadow_color cor usada na sombra que indica elevação.
surface_tint_color tonalidade da superfície Material que contém o conteúdo do NavigationDrawer.

Nota † ControlState é um enum com os valores: DEFAULT, DISABLED, DRAGGED, ERROR, FOCUSED, HOVERED, PRESSED, SELECTED, SCROLLED_UNDER.

Eventos da NavigationBar

Os controles NavigationBarDestination não possuem nenhum evento associado. O único evento do conjunto está na troca de seleção entre as opções dispostas na NavigationBar.

Evento Descrição
on_change dispara quando o destino é alterado, por exemplo por meio de um clique nos botões de destino.

Propriedades de NavigationBarDestination

 

Propriedade Descrição
bgcolor cor do botão de destino.
icon nome do ícone do botão de destino.
icon_content ícone usado dentro do destino (em vez da propriedade icon). Se selected_icon_content for fornecido essa propriedade só será exibida quando o destino não estiver selecionado.
label rótulo (texto) que aparece abaixo do ícone do NavigationBarDestination.
selected_icon ícone alternativo para exibição quando o destino é selecionado.
selected_icon_content um controle de ícone alternativo exibido quando este destino é selecionado. Se este controle não for fornecido, a NavigationBar exibirá icon_content em qualquer estado.

Exemplo de Uso da NavigationBar e NavigationBarDestination

import flet as ft

def main(page: ft.Page):
    page.horizontal_alignment = "center"
    page.bgcolor=ft.colors.BLUE_100
    page.title = "Exemplo de NavigationBar"
    controle=["Explorar", "Carona", "Ônibus", "Apagar"]

    def mostrar_barra(e):
        nav_barra.visible=not nav_barra.visible
        bt.text=f"{'Ocultar' if nav_barra.visible else 'Exibir'} Barra de Navegação"
        mensagem.value += f"\nVocê {'exibiu' if nav_barra.visible else 'ocultou'} a Barra de Navegação"
        page.update()

    def mudou_destino(e):
        if e.control.selected_index==3:
            mensagem.value="Suas ações serão vistas aqui:\n"
        else:
            mensagem.value += f"\nVocê selecionou o botão {controle[e.control.selected_index]}"
        page.update()

    nav_barra=ft.NavigationBar(
        visible=False,
        destinations=[
            ft.NavigationBarDestination(icon=ft.icons.EXPLORE, label="Explorar"),
            ft.NavigationBarDestination(icon=ft.icons.PERSON, label="Carona"),
            ft.NavigationBarDestination(icon=ft.icons.DIRECTIONS_BUS, label="Ônibus"),
            ft.NavigationBarDestination(
                icon=ft.icons.HIDE_IMAGE,
                selected_icon=ft.icons.HIDE_SOURCE,
                label="Apagar"
            ),
        ],
        on_change=mudou_destino
    )
    page.navigation_bar = nav_barra
    mensagem=ft.Text("Suas ações serão vistas aqui:\n", color=ft.colors.BLACK)
    bt=ft.ElevatedButton("Exibir NavigationBar", on_click=mostrar_barra)
    page.add(bt, mensagem)

ft.app(target=main)
Figura 1

A figura 1 mostra o estado do aplicativo em execução. A primeira imagem é o estado após a exibição da barra de navegação e clique no botão Explorar. Ao lado o resultado do clique no botão Apagar.

Flet: MenuBar

Controle MenuBar

Um controle MenuBar é uma barra que normalmente é posta acima da página principal do aplicativo para abrigar um sistema de menus e outros controles usados para as ações principais do usuário. Ela pode conter um sistema de menus composto por submenus e, se desejado, pode ser colocado em qualquer parte do aplicativo.

Propriedades de MenuBar

O controle MenuBar possui poucas propriedades. Como ele pode conter diversos outros controles filhos as formatação e coleta de eventos se dá, em geral, nesses filhos. As seguintes propriedades estão definidas para o controle MenuBar:

Propriedade Descrição
clip_behavior informa de o conteúdo deste controle deve ser cortado (clipped); O valor é do tipo ClipBehavior com default ClipBehavior.NONE.
controls a lista de itens de menu que são os filhos do MenuBar.
style estilização do controle, com valor do tipo MenuStyle.

Exemplo de Uso do MenuBar

import flet as ft

def main(page: ft.Page):
    page.horizontal_alignment = "center"

    def delete(e):
        mensagem.value=""
        page.open(ft.SnackBar(ft.Text("Você apagou as mensagens!")))
        page.update()

    def hover_submenu(e):
        page.open(ft.SnackBar(ft.Text(f"Hover em {e.control.content.value}!")))
        page.update()

    def clique_menu(e):
        mensagem.value+=f"\nClicou em {e.control.content.value}"
        page.update()

    def abre_submenu(e):
        mensagem.value+=f"\nAbrir {e.control.content.value}"
        page.update()

    def fecha_submenu(e):
        mensagem.value+=f"\nFechar {e.control.content.value}"
        page.update()

    icone=[ft.icons.HELP, ft.icons.SAVE, ft.icons.DOOR_BACK_DOOR,
           ft.icons.TEXT_INCREASE , ft.icons.TEXT_DECREASE]

    class MenuItem(ft.MenuItemButton):
        def __init__(self, texto, ico):
            super().__init__()
            self.content=ft.Text(texto)
            self.leading=ft.Icon(icone[ico])
            self.style=ft.ButtonStyle(bgcolor={ft.ControlState.HOVERED: ft.colors.BLUE_100})
            self.on_click=clique_menu

    class SubMenu(ft.SubmenuButton):
        def __init__(self, texto, controles):
            super().__init__()
            self.content=ft.Text(texto)
            self.on_open=abre_submenu
            self.on_close=fecha_submenu
            self.on_hover=hover_submenu
            self.controls=controles

    page.appbar = ft.AppBar(
        title=ft.Text("Demonstração do Controle MenuBar e SnackBar"),
        center_title=True,
        bgcolor=ft.colors.BLUE
    )

    mensagem=ft.Text("", size=20)
    estilo=ft.MenuStyle(alignment=ft.alignment.top_left, bgcolor=ft.colors.RED_300)
    bt_apagar=ft.IconButton(ft.icons.DELETE, icon_color="white", on_click=delete)
    subMenu1=SubMenu("Arquivo",[MenuItem("Sobre", 0), MenuItem("Gravar", 1), MenuItem("Terminar", 2)])
    subMenu2=SubMenu("Visualizar", [SubMenu("Zoom", [MenuItem("Ampliar", 3),MenuItem("Diminuir", 4)])])
    menu_bar=ft.MenuBar(expand=True, style=estilo, controls=[bt_apagar, subMenu1, subMenu2])
    coluna = ft.Column(
        controls=[mensagem],
        height=700,
        alignment=ft.MainAxisAlignment.CENTER
    )

    page.add(ft.Row([menu_bar]), coluna)

ft.app(main)
Figura 1

O resultado desse código está mostrado na figura 1. A primeira imagem mostra o estado ao abrir o aplicativo e passar o cursor do mouse sobre o Menu Arquivo. A segundo mostra o estado após alguns cliques nos submenus de Arquivo. Um clique na lixeira apaga o texto no corpo da página.

Esse exemplo usa o controle SnackBar, que é uma barra de exibição de informações que se abre, temporariamente, no fundo da página do aplicativo.

Duas classes foram definidas:

  • MenuItem, que herda de ft.MenuItemButton e recebe apenas o texto e o ícone a exibir,
  • SubMenu, que herda de ft.SubmenuButton e recebe o texto e o array de controles que serão exibidos.

Esse é um recurso para evitar a declaração repetida de controles que possuem a maioria das propriedades comuns.

Estilo de formatação do código

Nota: adotei nesse bloco de código a prática de declarar os objetos antes de seu uso dentro das propriedades dos controles. Também é possível definir os blocos no ambiente em que são usados. A primeira opção foi usada buscando dar mais clareza ao código. Alguns programadores provavelmente preferem fazer do segundo modo. Esses estilos estão ilustrados abaixo:

# o estilo usado no texto:
    mensagem=ft.Text("", size=20)
    estilo=ft.MenuStyle(alignment=ft.alignment.top_left, bgcolor=ft.colors.RED_300)
    subMenu=SubMenu("Visualizar", [SubMenu("Zoom", [MenuItem("Ampliar"),MenuItem("Diminuir")])])
    menu_bar=ft.MenuBar(expand=True, style=estilo, controls=[subMenu])
    coluna=ft.Column(controls=[mensagem])
    linha=ft.Row([menu_bar])

    page.add(linha, coluna)
    
# alternativamente:

    mensagem=ft.Text("", size=20)
    page.add(
        ft.Row(
            ft.MenuBar(
                expand=True,
                style=ft.MenuStyle(
                    alignment=ft.alignment.top_left,
                    bgcolor=ft.colors.RED_300
                ),
                controls=[
                    SubMenu("Visualizar",
                        [SubMenu("Zoom", [MenuItem("Ampliar"), MenuItem("Diminuir")])]
                    )
                ]
            )
        ),
        ft.Column(controls=[mensagem])
    )


Se essa segunda forma de formatação for adotada é importante manter um sistema coerente de indentação (notando que não se trata da indentação obrigatória do Python para definir blocos).
Observe que a variávelmensagem (um flet.Text) continua sendo definida em separado para poder ser referenciada em uma função fora desse bloco.

Flet: AppBar e BottomAppBar

Controle Appbar

O controle AppBar insere uma barra de aplicativos, às vezes chamada de barra de ação, na parte superior da página do Flet. Essa barra pode conter botões, menus dropdown e outros widgets que acionam ações desejados pelo usuário. A barra de aplicativos tem uma estrutura visual e elementos interativos familiares para os usuários.

Exemplo de Uso da Appbar

Um controle AppBar é aplicado à propriedade da página, page.appbar = app_barra. O código a seguir mostra um pequeno aplicativo que faz uso da Appbar.

import flet as ft

def main(page: ft.Page):
    page.bgcolor="#72BFDE"
    page.horizontal_alignment=ft.CrossAxisAlignment.CENTER

    def clicou_botao(e):
        texto.value += f"\nO ícone \"{e.control.icon}\" foi clicado"
        page.update()

    def clicou_check(e):
        e.control.checked = not e.control.checked
        insere = f"\nO {e.control.text} {'' if e.control.checked else 'não'} está selecionado!"
        texto.value += insere
        page.update()

    class Pop(ft.PopupMenuItem):
        def __init__(self, texto):
            super().__init__()
            self.text=texto
            self.checked=False
            self.on_click=clicou_check

    app_barra = ft.AppBar(
        leading=ft.IconButton(ft.icons.SOUTH_AMERICA, icon_color="white", on_click=clicou_botao),
        leading_width=40,
        title=ft.Text("AppBar: Barra de Aplicativo", color="white"),
        center_title=False,
        bgcolor="#8FD0DA",
        actions=[
            ft.IconButton(ft.icons.PODCASTS, icon_color="white", on_click=clicou_botao),
            ft.IconButton(ft.icons.CAR_REPAIR, icon_color="white", on_click=clicou_botao),
            ft.PopupMenuButton(
                items=[Pop("Item 1"), Pop("Item 2"), Pop(""), Pop("Item 3")],
                bgcolor="#A88413", icon_color="#ffffff"
            ),
        ],
    )

    titulo = ft.Text("Clique nos ícones ou menu dropdown", size=15, color="#333333")
    texto = ft.Text("", size=20, color=ft.colors.BLACK)

    page.appbar = app_barra
    page.add(
        ft.Text(
            "Lista de ações executadas:",
            size=30,
            color=ft.colors.BLACK
        ),
        ft.Container(
            content=ft.Column([titulo, texto]),
            padding=20,
            width=500, height=500,
            bgcolor=ft.colors.BLUE_100,
            border=ft.border.all(1, "#aaaaff")
        )
    )

ft.app(target=main)

A variável app_barra contém uma AppBar com ícones e um menu dropdown. Um clique em cada ícone ativa a função clicou_botao(e) que acrescenta uma linha de texto à variável texto que é um controle dentro do container na página.

Os cliques ativam as funções clicou_botao(e) e clicou_check(e) que recebem os objetos de eventos e (da classe ControlEvent). Esse objeto possui a propriedade .control que, por sua vez possui um dicionárioiconbutton, no caso do IconButton e popupmenuitem, no caso do PopupMenuButton. Os dois dicionários estão listados abaixo (para algum momento da execução):

  • iconbutton = {‘icon’: ‘podcasts’, ‘iconcolor’: ‘white’, ‘n’: ‘action’}
  • popupmenuitem = {‘text’: ‘Item 1’, ‘checked’: False}

Em execução o aplicativo é renderizado de acordo com a figura 1. A figura 1(a) mostra o estado inicial, com o PopupMenuButton clicado. A figura 1(b) representa o estado após um clique nos três ícones, seguidos de 2 cliques no item 1 do menu.

Figura 1: AppBar

Propriedades de AppBar

As seguintes propriedades estão definidas para o controle AppBar:

Propriedade Descrição
actions uma lista de controles a exibir na linha, depois do título.
Normalmente são IconButtons mas pode ser usado um PopupMenuButton.
Se AppBar.adaptive=True em dispositivo iOS ou macOS, apenas o primeiro elemento da lista será exibido.
adaptive booleano, default=False. Se True, o controle será adaptável à plataforma de destino. No iOS e macOS, uma barra CupertinoAppBar é criada, com funcionalidade e aparência esperadas no iOS. Nas demais plataformas, um Material AppBar é criado.
automatically_imply_leading booleano, válida apenas se leading = null. Se False aloca o espaço inicial para o título. Se True tenta deduzir automaticamente será o controle na primeira posição.
bgcolor cor de fundo da AppBar. A cor do tema atual é o default.
center_title booleano, default=False. Se o título deve ser centralizado.
clip_behavior O comprtamento de recorte (clipping) do conteúdo. O valor é do tipo ClipBehavior.
color definição de cor para os controles de texto e ícones na barra. A cor padrão é definida pelo tema atual.
elevation elevação da barra de aplicativos. Observação: o efeito só é visível quando o design Material 2 é usado (Theme.use_material3=False). O valor é do tipo OptionalNumber com default 4.
elevation_on_scroll elevação usada se houver algum controle rolado sob a barra. O valor é do tipo OptionalNumber.
exclude_header_semantics booleano, default=False. Se o título deve envolver um controle Semantics.
force_material_transparency booleano. Torna a barra transparente (em vez do padrão Material). Também remove a exibição visual de bgcolor e elevation (e outras características).
is_secondary booleano, default=False. Se a barra não é exibida na parte superior da tela.
leading controle exibido antes do título na barra. Normalmente é um Icon ou um IconButton. O valor é do tipo Control.
leading_width largura do controle leading. O valor é do tipo OptionalNumber com default 56,0.
shadow_color cor da sombra abaixo da barra, só visível se a elevation > 0.
shape A forma da barra e de sua sombra. O valor é do tipo OutlinedBorder.
surface_tint_color cor da sobreposição entre tom da superfície e da barra para indicar elevação. Default: nenhuma sobreposição é aplicada.
title controle principal exibido na barra, normalmente, um controle de texto. Se AppBar.adaptive=True no iOS ou macOS, o controle é centralizado automaticamente. O valor é do tipo Control.
title_spacing Espaçamento do título no eixo horizontal, aplicado mesmo se não não existirem controles leading ou action.
Se title_spacing = 0.0 o título ocupa todo o espaço disponível. O valor é do tipo OptionalNumber.
title_text_style estilo usado nos controles de texto do título. O valor é do tipo TextStyle.
toolbar_height altura do componente toolbar na AppBar. O valor é do tipo OptionalNumber, com default 56.0.
toolbar_opacity opacidade da barra, variando de 0.0 (transparente) a 1.0 (totalmente opaco). O valor é do tipo OptionalNumber com default 1.0.
toolbar_text_style estilo usado nos controles de texto leading ou action, exceto no título. O valor é do tipo TextStyle.


Notas †:Semantics Um controle que leva uma anotação descrendo o significado do widget. Usado para acessibilidade, search engines e ferramentas de análise semântica.

Controle BottomAppBar

O controle BottomAppBar é similar ao AppBar mas disposto no fundo da página do aplicativo.

Propriedades de BottomAppBar

As seguintes propriedades estão definidas para o controle BottomAppBar:

Propriedade Descrição
bgcolor cor de fundo para o BottomAppBar. A cor default é definida pelo tema atual.
clip_behavior O conteúdo será recortado (ou não) de acordo com esta opção. O valor é do tipo ClipBehavior e o default é ClipBehavior.NONE.
content Um controle filho contido pelo BottomAppBar.
elevation controla a elevação (e portanto a sombra abaixo do BottomAppBar). O default é 4.
height altura do BottomAppBar. O default é 80,0 no material 3.
notch_margin margem entre o FloatingActionButton e o entalhe (notch) do BottomAppBar. Só visível se shape=None.
padding margens internas na decoração (fundo, borda). É uma instância da classe Padding, e o default é padding.symmetric(vertical=12.0, horizontal=16.0).
shadow_color cor da sombra abaixo da BottomAppBar.
shape entalhe (notch) para o botão de ação flutuante. O valor é do tipo NotchShape.
surface_tint_color cor usada como sobreposição de bgcolor para indicar elevação. Se for None, nenhuma sobreposição será aplicada. Caso contrário, a cor será composta em cima de bgcolor com opacidade relacionada à elevação e a cor de fundo da BottomAppBar. O default é None.

Nota: †: Notch ou entalhe é o recorte usado para acomodar componentes na parte superior frontal na tela dos smartphones.

Exemplo de Uso da BottomAppbar

Um controle BottomAppBar é aplicado à propriedade da página, page.bottom_appbar = barra_fundo. O código a seguir mostra um pequeno aplicativo que faz uso da BottomAppbar.

import flet as ft

def main(page: ft.Page):
    def clicou(e):
        texto.visible = not texto.visible
        page.update()

    page.horizontal_alignment = page.vertical_alignment = "center"
    page.floating_action_button = ft.FloatingActionButton(icon=ft.icons.ADD, on_click=clicou)
    page.floating_action_button_location = ft.FloatingActionButtonLocation.CENTER_DOCKED

    page.bottom_appbar = ft.BottomAppBar(
        bgcolor=ft.colors.BLUE,
        shape=ft.NotchShape.CIRCULAR,
        content=ft.Row(
            controls=[
                ft.IconButton(icon=ft.icons.MENU, icon_color=ft.colors.WHITE),
                ft.Container(expand=True),
                ft.IconButton(icon=ft.icons.SEARCH, icon_color=ft.colors.WHITE),
                ft.IconButton(icon=ft.icons.FAVORITE, icon_color=ft.colors.WHITE),
            ]
        ),
    )

    texto = ft.Text(
        (
        'Lorem ipsum dolor sit amet, consectetur adipisicing elit,\n'
        'sed do eiusmod tempor incididunt ut labore et dolore magna\n'
        'aliqua. Ut enim ad minim veniam, quis nostrud exercitation\n'
        'ullamco laboris nisi ut aliquip ex ea commodo consequat.\n\n'
        'Duis aute irure dolor in reprehenderit in voluptate velit\n'
        'esse cillum dolore eu fugiat nulla pariatur. Excepteur sint\n'
        'occaecat cupidatat non proident, sunt in culpa qui officia\n'
        'deserunt mollit anim id est laborum.'
        ),
        size=15, color=ft.colors.WHITE
    )

    page.add(texto)

ft.app(target=main)
Figura 2: BottomAppBar

A figura 2 mostra a execução do aplicativo. Cliques no botão FloatingActionButton (com o ícone +) ocultam / exibem a texto centralizado na página.

Versões Estilizadas para IOS

Dois controles análogos estão disponíveis com o estilo iOS:

Um exemplo breve de uso está descrito a seguir:

import flet as ft

def main(page: ft.Page):
    page.theme_mode = ft.ThemeMode.LIGHT
    page.horizontal_alignment = page.vertical_alignment = "center"
    page.bgcolor="#F4F0BD"
    icone = ["Bússula", "Carros", "Bandeira"]

    def clicou(e):
        texto2.value += f"\nClicou no ícone {icone[e.control.selected_index]}"
        page.update()

    page.appbar = ft.CupertinoAppBar(
        leading=ft.Icon(ft.icons.PALETTE),
        bgcolor="#976A4E",
        trailing=ft.Icon(ft.icons.WB_SUNNY_OUTLINED),
        middle=ft.Text("Exemplo de CupertinoAppBar e CupertinoNavigationBar")
    )

    page.navigation_bar = ft.CupertinoNavigationBar(
        bgcolor="#4E7B97",
        inactive_color=ft.colors.GREY,
        active_color=ft.colors.BLACK,
        on_change=clicou,
        destinations=[
            ft.NavigationBarDestination(icon=ft.icons.EXPLORE, label="Bússula"),
            ft.NavigationBarDestination(icon=ft.icons.COMMUTE, label="Carros"),
            ft.NavigationBarDestination(
                icon=ft.icons.BOOKMARK_BORDER,
                selected_icon=ft.icons.BOOKMARK,
                label="Bandeira",
            ),
        ]
    )
    texto1 = ft.Text("Exemplo de Uso dos controles:\n\nCupertinoAppBar e CupertinoNavigationBar", size=18)
    texto2 = ft.Text("", size=20)
    page.add(texto1, texto2)

ft.app(target=main)

O Material Design é desenvolvido pelo Google e pode ser usado para desenvolver aplicativos Android, iOS, web e desktop.O Cupertino é desenvolvido pela Apple. Ele é baseado nas Diretrizes de Interface Humana da Apple, que implementam a linguagem de design atual do iOS.

O Flutter e o Flet vem com bibliotecas de widgets Material e Cupertino para desenvolver um aplicativo que pareça e seja nativo para qualquer plataforma.

Figura 3: Controles estilizados Cupertino

A figura 3 mostra a execução do aplicativo após cliques nos botões na barra de fundo.

Flet: Controles personalizados

Personalizando Controles

O Flet inclui muitos controles prontos para uso, como já listamos nessas páginas. Mesmo assim é sempre possível que o desenvolvedor pense em um controle diferente, personalizado para fim específico. No Flet podemos partir dos controles embutidos e modificá-los, usando os conceitos de programação orientada a objetos do Python. Os controles definidos dessa forma podem ser armazenados e reutilizados posteriormente em outros projetos.

Controles estilizados

A personalização mais simples consiste em usar um controle existente e o estilizar, gerando nova aparência e acrescentando funcionalidades (métodos). Para fazer isso você cria uma nova classe em Python que herda do controle Flet que se deseja personalizar. No exemplo seguinte modificamos um botão ElevatedButton:

class NovoBotao(ft.ElevatedButton)
    def __init__(self, texto):
        super().__init__()
        self.bgcolor = ft.colors.ORANGE_300
        self.color = ft.colors.GREEN_800
        self.text = texto

O controle assim personalizado possui um construtor que define propriedades e eventos, além de passar dados, no caso através da variável texto. A chamada a super().__init__() no construtor dá o acesso às propriedades e métodos originais do controle Flet usado na herança. Uma vez criada essa classe esse controle pode ser usado no aplicativo:

import flet as ft

def main(page: ft.Page):
    page.add(NovoBotao(text="Sim"), NovoBotao(text="Não"))

ft.app(target=main)

Um exemplo de uso pode ser visto no código abaixo:


import flet as ft

def clicou_sim(e):
    e.control.text = "Clicou sim!"
    e.control.update()

def clicou_nao(e):
    e.control.text = "Clicou não!"
    e.control.update()

class NovoBotao(ft.ElevatedButton):
    def __init__(self, clicou, texto="Não"):
        super().__init__()
        self.bgcolor = ft.colors.BLUE_800
        self.color = ft.colors.YELLOW_100
        self.icon="chair_outlined"
        self.icon_color="GREEN_100"
        self.text = texto
        self.on_click = clicou

def main(page: ft.Page):
    page.bgcolor=ft.colors.BLUE_50

    page.add(
        NovoBotao(texto="Sim", clicou = clicou_sim),
        NovoBotao(clicou = clicou_nao)
    )

ft.app(target=main)
Figura 1

No exemplo acima vemos que a classe estende um ElevatedButton e seu construtor permite a alteração do texto e do nome da função executada sob o evento on_click. Essas funções devem estar definidas antes do ponto em que serão chamadas, e antes da definição da classe. Por default o texto no botão será “Não”. A execução do código gera a janela inicial com os botões ilustrados na figura 1 (a), que se alteram para 1 (b) quando o botão “Não” é clicado.

Controles Compostos

Alguns exemplos de widgets do Flet que são também containers (podem conter outros controles internamente, são: View, Page, Container, Column, Row e Stack.

Os controles personalizados compostos herdam de controles que podem ser também containers, como Page, Row ou Column, que por sua vez abrigam outros controles filhos. O controle criado dessa forma tem acesso às propriedades e métodos do container e também dos controles filhos.

O exemplo abaixo mostra um esqueleto de um aplicativo TODO simples, que define um controle personalizado que herda de ft.Row e acrescenta outros controles.

                                                                                   
import flet as ft

class Row_Tarefa(ft.Row):
    def __init__(self, texto):
        super().__init__()
        self.ver_texto = ft.Text(texto)
        self.editar_texto = ft.TextField(texto, visible=False)
        self.editar_botao = ft.IconButton(
            icon=ft.icons.EDIT,
            on_click=self.modificar
        )
        self.gravar_botao = ft.IconButton(
            icon=ft.icons.SAVE,
            on_click=self.modificar,
            visible=False
        )
        self.controls = [
            ft.Checkbox(),
            self.ver_texto,
            self.editar_texto,
            self.editar_botao,
            self.gravar_botao,
        ]

    def modificar(self, e):
        op = e.control.icon=="save"
        self.editar_botao.visible = op
        self.gravar_botao.visible = not op
        self.ver_texto.visible = op
        self.editar_texto.visible = not op
        if op:
            self.ver_texto.value = self.editar_texto.value
        self.update()

def main(page: ft.Page):

    page.add(
        Row_Tarefa(texto="Fazer Compras"),
        Row_Tarefa(texto="Terminar Código"),
        Row_Tarefa(texto="Enviar Projeto"),
    )

ft.app(target=main)

Figura 2

A execução desse código gera a janela mostrada na figura 2: (a) é a janela inicial; (b) o primeiro botão de editar foi clicado e o texto alterado; (c) a alteração foi transferida para o texto, com um clique no botão de gravar.

Observe que o controle herda de Row e acrescenta a ele os controles ft.Text, ft.TextField e dois controles ft.IconButton, que não existem no controle pai. Esses controle são inseridos nas propriedades personalizadas ver_texto, editar_texto, editar_botao e gravar_botao. Definidas essas propriedades elas são inseridas, juntas com um Checkbox, na lista de controles (controls) (que e nativa de Row). Três linhas com o objeto Row_Tarefa são inseridos na página.

Tanto o botão gravar_botao quanto editar_botao respondem ao evento on_click ativando a função modificar que recebe o parâmetro e que contém a propriedade e.control.icon=="save"/"edit". A função decide com ela quais controles devem ser exibidos ou ocultados, e altera a propriedade ver_texto.value quando o botão gravar foi clicado.

Nenhum evento foi definido associado aos botões Checkbox que, por isso, não executam nenhuma ação.

Métodos do ciclo de vida

Quando você cria controles personalizados, alguns métodos se tornam disponíveis para o gerenciamento do ciclo de vida do controle:

Método Efeito
build() chamado quando o controle está sendo criado e atribuído à página. Ele pode ser sobrescrito (override) para implementar uma lógica que não pode ser executada no construtor do controle porque necessita do acesso à self.page. Por exemplo: esse seria o local certo para escolher um ícone que depende qual é a plataforma em self.page.platform.
did_mount() chamado após a adição do controle à página e recebe um uid transitório. Por exemplo: o widget Wheather chama uma API (API Open Weather) a cada minuto para atualizar seus dados climáticos.
will_unmount() chamado antes que o controle seja removido da página. Pode ser usado para operação de limpeza.
before_update() chamado sempre que o controle está sendo atualizado. O método update() não deve ser chamado dentro de before_update(), ou um loop infinito seria gerado.

Controles isolados

Controles personalizados recebem automaticamente a propriedade is_isolated, que recebe um booleano com False. Se for ajustado is_isolated = True esse controle fica isolado do layout geral, o que significa que quando o método update() for chamado no controle pai, o próprio pai e seus filhos serão atualizados, exceto o controle isolado. Para atualizar controles isolados, seu próprio método self.update() deve ser chamado. É boa prática que, se self.update() for chamado em um controle personalizado, que ele seja isolado.

Por exemplo, nos códigos acima, o botão NovoBotao não precisa ser isolado, mas Row_Tarefa(ft.Row) deve ser:

class Row_Tarefa(ft.Row):
    def __init__(self, texto):
        super().__init__()
        self.isolated = True
        self.ver_texto = ft.Text(texto)
        self.editar_texto = ft.TextField(texto, visible=False)