Tutorial 4 - Atualizando sua aplicação¶
No último tutorial, empacotamos nosso aplicativo como um aplicativo nativo. Se estiver lidando com um aplicativo do mundo real, esse não será o fim da história - você provavelmente fará alguns testes, descobrirá problemas e precisará fazer algumas alterações. Mesmo que o seu aplicativo seja perfeito, você eventualmente desejará publicar a versão 2 do seu aplicativo com melhorias.
Então, como você atualiza o aplicativo instalado quando faz alterações no código?
Atualização do código do aplicativo¶
Atualmente, nosso aplicativo imprime no console quando você pressiona o botão. No entanto, os aplicativos de GUI não devem realmente usar o console para saída. Eles precisam usar caixas de diálogo para se comunicar com os usuários.
Vamos adicionar uma caixa de diálogo para dizer olá, em vez de escrever no console. Modifique o retorno de chamada say_hello
para que ele tenha a seguinte aparência:
async def say_hello(self, widget):
await self.main_window.dialog(
toga.InfoDialog(
f"Hello, {self.name_input.value}",
"Hi there!",
)
)
We need to make the method async
so that when we display the dialog, the rest of
the application continues to run. Don’t worry about this detail too much right now -
we’ll give a more detailed explanation in Tutorial 8.
Isso instrui o Toga a abrir uma caixa de diálogo modal quando o botão é pressionado.
Se você executar briefcase dev
, digitar um nome e pressionar o botão, verá a nova caixa de diálogo:



No entanto, se você executar o briefcase run
, a caixa de diálogo não será exibida.
Por que isso acontece? Bem, o briefcase dev
opera executando seu código no local - ele tenta produzir o ambiente de tempo de execução mais realista possível para seu código, mas não fornece nem usa nenhuma infraestrutura da plataforma para empacotar seu código como um aplicativo. Parte do processo de empacotamento do aplicativo envolve a cópia do código para o pacote de aplicativos e, no momento, o aplicativo ainda contém o código antigo.
Portanto, precisamos dizer ao briefcase para atualizar seu aplicativo, copiando a nova versão do código. Poderíamos fazer isso excluindo o diretório da plataforma antiga e começando do zero. No entanto, o Briefcase oferece uma maneira mais fácil: você pode atualizar o código do seu aplicativo empacotado existente:
(beeware-venv) $ briefcase update
[helloworld] Updating application code...
Installing src/helloworld... done
[helloworld] Removing unneeded app content...
Removing unneeded app bundle content... done
[helloworld] Application updated.
(beeware-venv) $ briefcase update
[helloworld] Finalizing application configuration...
Targeting ubuntu:jammy (Vendor base debian)
Determining glibc version... done
Targeting glibc 2.35
Targeting Python3.10
[helloworld] Updating application code...
Installing src/helloworld... done
[helloworld] Removing unneeded app content...
Removing unneeded app bundle content... done
[helloworld] Application updated.
(beeware-venv) C:\...>briefcase update
[helloworld] Updating application code...
Installing src/helloworld... done
[helloworld] Removing unneeded app content...
Removing unneeded app bundle content... done
[helloworld] Application updated.
Se o Briefcase não conseguir encontrar o modelo de andaime, ele invocará automaticamente o create
para gerar um novo andaime.
Agora que atualizamos o código do instalador, podemos executar o briefcase build
para recompilar o aplicativo, o briefcase run
para executar o aplicativo atualizado e o briefcase package
para reembalar o aplicativo para distribuição.
(Usuários do macOS, lembrem-se de que, conforme observado em Tutorial 3, para o tutorial, recomendamos executar o briefcase package
com o sinalizador --adhoc-sign
para evitar a complexidade da configuração de uma identidade de assinatura de código e manter o tutorial o mais simples possível)
Atualize e execute em uma única etapa¶
Se estiver iterando rapidamente as alterações no código, provavelmente desejará fazer uma alteração no código, atualizar o aplicativo e executá-lo novamente de imediato. Para a maioria das finalidades, o modo de desenvolvedor (briefcase dev
) será a maneira mais fácil de fazer esse tipo de iteração rápida; no entanto, se estiver testando algo sobre como o aplicativo é executado como um binário nativo ou procurando um bug que só se manifesta quando o aplicativo está no formato empacotado, talvez seja necessário usar chamadas repetidas para briefcase run
. Para simplificar o processo de atualização e execução do aplicativo empacotado, o Briefcase tem um atalho para suportar esse padrão de uso - a opção -u
(ou --update
) no comando run
.
Vamos tentar fazer outra alteração. Você deve ter notado que, se não digitar um nome na caixa de entrada de texto, a caixa de diálogo dirá «Hello, «. Vamos modificar a função say_hello
novamente para lidar com esse caso extremo.
Na parte superior do arquivo, entre as importações e a definição da classe HelloWorld
, adicione um método utilitário para gerar uma saudação apropriada, dependendo do valor do nome que foi fornecido:
def greeting(name):
if name:
return f"Hello, {name}"
else:
return "Hello, stranger"
Em seguida, modifique a chamada de retorno say_hello
para usar esse novo método utilitário:
async def say_hello(self, widget):
await self.main_window.dialog(
toga.InfoDialog(
greeting(self.name_input.value),
"Hi there!",
)
)
Execute seu aplicativo no modo de desenvolvimento (com briefcase dev
) para confirmar que a nova lógica funciona; em seguida, atualize, crie e execute o aplicativo com um único comando:
(beeware-venv) $ briefcase run -u
[helloworld] Updating application code...
Installing src/helloworld... done
[helloworld] Removing unneeded app content...
Removing unneeded app bundle content... done
[helloworld] Application updated.
[helloworld] Building application...
...
[helloworld] Built build/helloworld/macos/app/Hello World.app
[helloworld] Starting app...
(beeware-venv) $ briefcase run -u
[helloworld] Finalizing application configuration...
Targeting ubuntu:jammy (Vendor base debian)
Determining glibc version... done
Targeting glibc 2.35
Targeting Python3.10
[helloworld] Updating application code...
Installing src/helloworld... done
[helloworld] Removing unneeded app content...
Removing unneeded app bundle content... done
[helloworld] Application updated.
[helloworld] Building application...
...
[helloworld] Built build/helloworld/linux/ubuntu/jammy/helloworld-0.0.1/usr/bin/helloworld
[helloworld] Starting app...
(beeware-venv) C:\...>briefcase run -u
[helloworld] Updating application code...
Installing src/helloworld... done
[helloworld] Removing unneeded app content...
Removing unneeded app bundle content... done
[helloworld] Application updated.
[helloworld] Starting app...
O comando package também aceita o argumento -u
, portanto, se você fizer uma alteração no código do aplicativo e quiser reempacotar imediatamente, poderá executar briefcase package -u
.
Próximos passos¶
Agora temos nosso aplicativo empacotado para distribuição em plataformas de desktop e conseguimos atualizar o código em nosso aplicativo.
Mas e quanto ao celular? No Tutorial 5, converteremos nosso aplicativo em um aplicativo móvel e o implantaremos em um simulador de dispositivo e em um telefone.