Flet, exemplos 1
Usando métodos para alterar propriedades de widgets
Os valores de propriedades dos widgets (exceto aqueles que são de leitura somente) podem ser alterados dinamicamente pelo código e por ação do usuário. O código abaixo, além de inserir cidades previamente digitadas em uma lista, permite que usário insira novos nomes.
1 import flet as ft 2 import time 3 4 def main(page=ft.Page): 5 def inserir(e): 6 txt = txt_cidade.value.strip() 7 if txt: 8 page.controls.append(ft.Text(txt)) 9 txt_cidade.value = "" 10 page.update() 11 12 page.add(ft.Row([ft.Text("Estas são cidades brasileiras")])) 13 txt_cidade = ft.TextField(label="Sua cidade") 14 page.add( 15 ft.Row([ 16 txt_cidade, 17 ft.ElevatedButton(text="Insira o nome de sua cidade!", on_click=inserir) 18 ]) 19 ) 20 cidades = ["Belo Horizonte","Curitiba","São Paulo","Salvador","----------"] 21 for i in range(len(cidades)): 22 page.add(ft.Text(cidades[i])) 23 time.sleep(.5) 24 25 ft.app(target=main)
Na linha 17 atribuímos uma função ao evento on_click do botão. Essa função é disparada com o clique, enviando o parâmetro e
que tem várias propriedades, não utilizadas aqui. A função inserir(e)
coleta o conteúdo de txt_cidade, a caixa de texto definida na linha 16, remove espaços em branco nas bordas da string, testa se ela é uma string não vazia e, se não for, cria e insere um texto na página com o conteúdo digitado pelo usuário. Lembrando, na linha 7, if txt
só retorna falso se txt for uma string vazia. A execução desse código produz o resultado mostrado na figura 1, após a inserção de nova cidade pelo usuário.
Alterando texto e cores de botões
Outro exemplo abaixo mostra dois botões associados a métodos diferentes, com a capacidade de alterar as propriedades do outro botão.
1 import flet as ft 2 import random 3 4 def main(page: ft.Page): 5 cores = {0:"black", 1:"#1D74FF", 2:"#C51709", 3:"#FFE000", 4:"#00CB4F", 6 5:"#A866DC", 6:"#FF6600", 7:"green", 8:"#145375"} 7 8 def mudar(e): 9 bt2.disabled = not bt2.disabled 10 bt2.text = "Mudar cor: desabilitado" if bt2.disabled else "Mudar cor: habilitado" 11 bt1.text="Habilitar" if bt2.disabled else "Desabilitar" 12 page.update() 13 14 def mudar_cor(e): 15 bt1.bgcolor = cores[random.randrange(0,8)] 16 page.update() 17 18 bt1 = ft.FilledButton(text="Desabilitar", width=250, on_click=mudar) 19 bt2 = ft.ElevatedButton("Mudar cor: habilitado", disabled=False, width=250, on_click=mudar_cor) 20 page.add(ft.Row([bt1, bt2])) 21 22 ft.app(target=main)
Um clique no botão 2 muda a cor do botão 1 escolhendo aleatóriamente entre as cores do dicionário cores. Cliques no botão 1 alternam a habilitação do botão 2.
Fontes, pés de página e referências a widgets
No próximo exemplo definimos duas fontes (de caracteres) para uso no aplicativo, que denominamos respectivamente por Kanit e Karma. A propriedade page.fonts é um dicionário com o nome e local do recurso, a primeira definida como um recurso externo por meio de uma URL, a segunda um recurso interno, na máquina onde roda o aplicativo, explicado abaixo.
A linha 68 define um flet.BottomSheet, uma janela modal (que impede a ação sobre outras partes do aplicativo), que pode ser usada como uma alternativa para uma janela modal ou de menu.
1 import flet as ft 2 3 def main(page: ft.Page): 4 5 page.title="Exibindo notas ocultas" 6 page.fonts = { 7 "Kanit": "https://raw.githubusercontent.com/google/fonts/master/ofl/kanit/Kanit-Bold.ttf", 8 "Karma": "fonts/Karma-Regular.ttf", 9 } 10 page.theme = ft.Theme(font_family="Kanit") 11 page.update() 12 13 def exibe_mensagem(txt): 14 mensagem.value=txt 15 mensagem.update() 16 17 def traduzir(e): 18 bt2.data = (bt2.data + 1)%2 19 conteudo.current.value = texto_nota[bt2.data] 20 page.update() 21 22 def bs_fechado(e): 23 exibe_mensagem("A nota foi ocultada por clique fora de sua área.") 24 25 def mostrar_pe(e): 26 bs.open = True 27 bs.update() 28 exibe_mensagem("A nota está exibida.") 29 30 def ocultar_pe(e): 31 bs.open = False 32 bs.update() 33 exibe_mensagem("A nota foi ocultada por clique no botão interno.") 34 35 def fechar_app(e): 36 page.window_destroy() 37 38 texto_nota=[( 39 'The Selfish Gene is a 1976 book on evolution by ethologist Richard Dawkins, in ' 40 'which the author builds upon the principal theory of George C. Williams\'s ' 41 'Adaptation and Natural Selection (1966). Dawkins uses the term "selfish gene" as ' 42 'a way of expressing the gene-centred view of evolution (as opposed to the views ' 43 'focused on the organism and the group), popularising ideas developed during the ' 44 '1960s by W. D. Hamilton and others.' 45 ), 46 ( 47 'O Gen Egoísta é um livro de 1976 sobre evolução do etólogo Richard Dawkins, no ' 48 'qual o autor se baseia na teoria principal de Adaptação e Seleção Natural de ' 49 'George C. Williams (1966). Dawkins usa o termo "gene egoísta" como forma de ' 50 'expressar a visão da evolução centrada no gene (em oposição às visões focadas no ' 51 'organismo e no grupo), popularizando ideias desenvolvidas durante a década de ' 52 '1960 por W. D. Hamilton e outros.' 53 )] 54 55 bt1=ft.ElevatedButton("Fechar a nota", on_click=ocultar_pe) 56 bt2=ft.ElevatedButton("Traduzir", data=0, on_click=traduzir) 57 bt3=ft.ElevatedButton("Exibir pé de página", on_click=mostrar_pe) 58 bt4=ft.ElevatedButton("Fechar Aplicativo", on_click=fechar_app) 59 60 mensagem=ft.Text("A nota não está exibida.", font_family="Karma", size=20) 61 conteudo=ft.Ref[ft.Text()]() 62 coluna_texto=ft.Column([ft.Text(ref=conteudo), ft.Row([bt1, bt2])]) 63 conteudo.current.font_family="Karma" 64 conteudo.width=600 65 conteudo.current.size=20 66 conteudo.current.value = texto_nota[0] 67 68 bs = ft.BottomSheet(ft.Container(coluna_texto, padding=50), open=False, on_dismiss=bs_fechado) 69 70 page.overlay.append(bs) 71 page.add( 72 ft.Text("Clique no botão para exibir a nota oculta", size=30), 73 mensagem, 74 ft.Row([bt3, bt4]), 75 ) 76 77 ft.app(target=main, assets_dir="assets")
A linha 77, que inicializa o aplicativo do flet, informa que estamos usando o diretório de recursos assets_dir=”assets”, onde podemos armazenar imagens, fontes e outros recursos. No caso do atual aplicativo o diretório code é a pasta raiz, de onde o código será executado. A fonte local Karma-Regular.ttf está gravada em code/assets/fonts/Karma-Regular.ttf, como mostrado na figura 3. Ela é inserida no dicionário page.fonts da linha 6 e utilizada nas linhas 60 e 63. A outra fonte é definida como padrão do aplicativo na linha 10.
A linha 68 inicializa o bs = BottomSheet, inicialmente fechado (invisível). Esse widget é exibido com o clique do botão bt3 (linha 57) e fechado com bt4 (linha 58). O BottomSheet é inserido na página com page.overlay.append(bs) (70). page.overlay é uma lista de controles que são exibidos por cima dos demais controles da página. O botão bt2 (traduzir) altera a exibição do texto em conteudo, escolhendo entre os dois textos armazenados na lista texto_nota. O índice do texto exibido a cada momento está armazenada na propriedade bt2.data.
Outro ponto digno de nota é o uso da referência para um controle usada na linha 61 em conteudo=ft.Ref[ft.Text()](). A classe Ref permite que se defina uma referência para um controle. No cao a referência é feita ao controle de texto associado à variável conteudo. Essa referência permite o uso posterior das propriedades e eventos do controle. Para lidar mais tarde com esse controle usamos a propriedade current como é feito nas linhas 66 e 19.
O resultado desse código ao ser executado é mostrado na figura 4, antes de pressionado o botão Exibir pé de página. A figura 5 exibindo o texto em inglês após pressionamento do botão. Um texto alternativo, em português é exibido quando se clica em Traduzir.