Ir para o conteúdo

Tutorial 7 - Usar bibliotecas de terceiros

Até o momento, a aplicação que criamos usou apenas o nosso próprio código, além do código fornecido pelo BeeWare. No entanto, numa aplicação do mundo real, provavelmente vai desejar usar uma biblioteca de terceiros, descarregada do Índice e Pacotes Python (PyPI).

Vamos modificar a nossa aplicação para incluir uma biblioteca de terceiros.

Adicionar um pacote

Vamos modificar a nossa aplicação para dizer um pouco mais do que apenas "Olá!".

Para gerar um texto mais interessante para a caixa de diálogo, vamos usar uma biblioteca chamada Faker. Faker é um pacote Python que gera conteúdo falso, incluindo nomes e blocos de texto. Os nomes e as palavras no bloco de texto são gerados a partir de uma lista arbitrária de palavras fornecidas pelo Faker. Vamos usar o Faker para construir uma mensagem falsa, como se alguém estivesse a responder ao utilizador.

Começamos por adicionar faker à nossa aplicação. Adicione uma importação no topo do app.py para importar faker:

import faker

Depois modifique a chamada de retorno say_hello() para ficar como isto:

async def say_hello(self, widget):
    fake = faker.Faker()
    await self.main_window.dialog(
        toga.InfoDialog(
            greeting(self.name_input.value),
            f"Uma mensagem de {fake.name()}: {fake.text()}",
        )
    )

Vamos correr a nossa aplicação atualizada no modo de desenvolvedor do Briefcase para verificar se a nossa alteração funcionou.

(beeware-venv) $ briefcase dev
Traceback (última chamada mais recente):
Ficheiro ".../venv/bin/briefcase", linha 5, em <module>
    from briefcase.__main__ import main
Ficheiro ".../venv/lib/python3.13/site-packages/briefcase/__main__.py", linha 3, em <módulo>
    from .cmdline import parse_cmdline
Ficheiro ".../venv/lib/python3.13/site-packages/briefcase/cmdline.py", linha 6, em <módulo>
    from briefcase.commands import DevCommand, NewCommand, UpgradeCommand
Ficheiro ".../venv/lib/python3.13/site-packages/briefcase/commands/__init__.py", linha 1, em <módulo>
    from .build import BuildCommand  # noqa
Ficheiro ".../venv/lib/python3.13/site-packages/briefcase/commands/build.py", linha 5, em <module>
    from .base import BaseCommand, full_options
Ficheiro ".../venv/lib/python3.13/site-packages/briefcase/commands/base.py", linha 14, em <módulo>
    import faker
ModuleNotFoundError: Nenhum módulo chamado 'faker'
(beeware-venv) $ briefcase dev
Traceback (última chamada mais recente):
Ficheiro ".../venv/bin/briefcase", linha 5, em <module>
    from briefcase.__main__ import main
Ficheiro ".../venv/lib/python3.13/site-packages/briefcase/__main__.py", linha 3, em <módulo>
    from .cmdline import parse_cmdline
Ficheiro ".../venv/lib/python3.13/site-packages/briefcase/cmdline.py", linha 6, em <módulo>
    from briefcase.commands import DevCommand, NewCommand, UpgradeCommand
Ficheiro ".../venv/lib/python3.13/site-packages/briefcase/commands/__init__.py", linha 1, em <módulo>
    from .build import BuildCommand  # noqa
Ficheiro ".../venv/lib/python3.13/site-packages/briefcase/commands/build.py", linha 5, em <module>
    from .base import BaseCommand, full_options
Ficheiro ".../venv/lib/python3.13/site-packages/briefcase/commands/base.py", linha 14, em <módulo>
    import faker
ModuleNotFoundError: Nenhum módulo chamado 'faker'
(beeware-venv) C:\...>briefcase dev
Traceback (última chamada mais recente):
Ficheiro "...\venv\bin\briefcase", linha 5, em <module>
    from briefcase.__main__ import main
Ficheiro "...\venv\lib\python3.13\site-packages\briefcase\__main__.py", linha 3, em <módulo>
    from .cmdline import parse_cmdline
Ficheiro "...\venv\lib\python3.13\site-packages\briefcase\cmdline.py", linha 6, em <módulo>
    from briefcase.commands import DevCommand, NewCommand, UpgradeCommand
Ficheiro "...\venv\lib\python3.13\site-packages\briefcase\commands\__init__.py", linha 1, em <módulo>
    from .build import BuildCommand  # noqa
Ficheiro "...\venv\lib\python3.13\site-packages\briefcase\commands\build.py", linha 5, em <module>
    from .base import BaseCommand, full_options
Ficheiro "...\venv\lib\python3.13\site-packages\briefcase\commands\base.py", linha 14, em <módulo>
    import faker
ModuleNotFoundError: Nenhum módulo chamado 'faker'

Não pode executar uma aplicação Android no modo de desenvolvedor - use as instruções para a sua plataforma de ambiente de trabalho escolhida.

Não pode executar uma aplicação iOS no modo de desenvolvedor - use as instruções para a plataforma de ambiente de trabalho escolhida.

O que aconteceu? Adicionamos faker ao nosso código, mas não o adicionamos ao ambiente virtual usado para executar a aplicação em modo de desenvolvimento.

Quando o Briefcase executa uma aplicação em modo de desenvolvimento, ele cria um ambiente virtual independente para essa aplicação, independente do ambiente em que executa briefcase. Se a sua aplicação não declarar que precisa de uma biblioteca específica, essa biblioteca não será instalada no ambiente virtual de desenvolvimento.

Então, como adicionar um novo requisito à sua aplicação?

Atualizar dependências

No diretório raiz da sua aplicação, há um ficheiro chamado pyproject.toml. Esse ficheiro contém todos os detalhes de configuração da aplicação que forneceu quando executou originalmente o briefcase new.

o pyproject.toml é dividido em secções; uma das secções descreve as configurações da sua aplicação:

[tool.briefcase.app.helloworld]
formal_name = "Hello World"
description = "Uma aplicação de tutorial"
long_description = """Mais detalhes sobre a aplicação devem ser inseridos aqui.
"""
sources = ["src/helloworld"]
requires = []

A opção requires descreve as dependências da nossa aplicação. É uma lista de strings que especifica as bibliotecas (e opcionalmente, as versões das bibliotecas) que deseja incluir na sua aplicação.

Modifique a definição requires para que fique assim:

requires = [
    "faker",
]

Ao adicionar essa configuração, estamos a dizer ao Briefcase "quando compilar a minha aplicação, corra pip install httpx no bolo da aplicação". Qualquer coisa que seja uma entrada legal para pip install pode ser usada aqui - por isso, pode especificar:

  • Uma versão específica da biblioteca (ex., "faker==37.3.0");
  • Uma gama de versões de biblioteca (ex., "faker>=37");
  • Um caminho para um repositório git (ex., "git+https://github.com/joke2k/faker/"); ou
  • Um caminho de ficheiro local (No entanto - esteja avisado: se der o seu código a outra pessoa, esse caminho provavelmente não vai existir no computador dessa pessoa!)

Mais abaixo no pyproject.toml, vai notar outras secções que dependem do sistema operativo, como [tool.briefcase.app.helloworld.macOS] e [tool.briefcase.app.helloworld.windows]. Essas secções também têm uma configuração requires. Estas configurações permitem definir dependências adicionais específicas da plataforma - assim, por exemplo, se precisar de uma biblioteca específica da plataforma para lidar com algum aspecto da sua aplicação, pode especificar essa biblioteca na secção requires específica da plataforma, e essa configuração será usada somente para essa plataforma. Vai reparar que as bibliotecas toga são todas especificadas na secção requires específica da plataforma - isso porque as bibliotecas necessárias para mostrar uma interface de utilizador são específicas da plataforma.

No nosso caso, queremos que o faker seja instalado em todas as plataformas, assim usamos a configuração requires em nível de aplicação. As dependências no nível da aplicação são sempre instaladas; as dependências específicas da plataforma são instaladas em adição das dependências no nível da aplicação.

Após adicionar o novo requisito, salve pyproject.toml e execute briefcase dev -r. A bandeira -r informa o Briefcase que os requisitos foram alterados, e o ambiente virtual de desenvolvimento precisa de ser atualizado:

(beeware-venv) $ briefcase dev -r

[helloworld] A ativar o ambiente de desenvolvimento...
...
A recriar o ambiente virtual (dev.cpython-313-darwin)... concluído

[hello-world] A instalar os pré-requisitos...
...

[helloworld] A iniciar no modo de desenvolvimento...
===========================================================================

Ao inserir um nome e pressionar o botão, deverá ver um diálogo semelhante a isto:

Caixa de diálogo do Tutorial 7 do Hello World, no macOS

(beeware-venv) $ briefcase dev -r

[helloworld] A ativar o ambiente de desenvolvimento...
...
A recriar ambiente virtual (dev.cpython-313-x86_64-linux-gnu)... concluído

[hello-world] A instalar pré-requisitos...
...

[helloworld] A iniciar em modo de desenvolvimento...
===========================================================================

Ao inserir um nome e pressionar o botão, deverá ver um diálogo semelhante a isto:

Caixa de diálogo do Tutorial 7 do Hello World, no Linux

(beeware-venv) C:\...>briefcase dev -r

[helloworld] A ativar o ambiente de desenvolvimento...
...
A recriar ambiente virtual (dev.cp313-win_amd64)... concluído

[hello-world] A instalar pré-requisitos...
...

[helloworld] A iniciar em modo de desenvolvimento...
===========================================================================

Ao inserir um nome e pressionar o botão, deverá ver um diálogo semelhante a isto:

Caixa de diálogo Hello World Tutorial 7, no Windows

Não pode executar uma aplicação Android no modo de desenvolvedor - use as instruções para a sua plataforma de ambiente de trabalho escolhida.

Não pode executar uma aplicação iOS no modo de desenvolvedor - use as instruções para a plataforma de ambiente de trabalho escolhida.

Possíveis erros ao executar briefcase dev

Se ainda estiver a receber um erro ao executar briefcase dev, certifique-se de que:

  1. Adicionou faker à lista requires em pyproject.toml;
  2. Salvou as suas alterações em pyproject.toml; e
  3. Incluiu o argumento -r ao executar briefcase dev -r.

Na primeira vez que executa a sua aplicação usando briefcase dev, o argumento -r é adicionado automaticamente por si — é por isso que até agora não precisamos usar o argumento -r. O argumento -r só é necessário quando se adiciona, remove ou altera um requisito depois de executar a sua aplicação no modo de desenvolvimento. Se apenas atualizou o código, pode executar briefcase dev como temos feito no resto deste tutorial.

Executa a aplicação atualizada

Agora temos uma aplicação funcional, usando uma biblioteca de terceiros, a correr em modo de desenvolvimento. Vamos empacotar este código atualizado da aplicação como uma aplicação independente. Como fizemos alterações no código, precisamos seguir os mesmos passos do Tutorial 4:

Atualizar o código na aplicação empacotada:

(beeware-venv) $ briefcase update

[helloworld] A atualizar o código da aplicação...
...

[helloworld] Aplicação atualizada.

Recompilar a aplicação:

(beeware-venv) $ briefcase build

[helloworld] A assinar adhoc a aplicação...
[helloworld] Compilado: build/helloworld/macos/app/Hello World.app

E finalmente, correr a aplicação:

(beeware-venv) $ briefcase run

[helloworld] A iniciar a aplicação...
===========================================================================

No entanto, quando a aplicação for executada, verá um erro na consola, além de um diálogo de falha:

Falha da aplicação Hello World Tutorial 7, no macOS

Atualizar o código na aplicação empacotada:

(beeware-venv) $ briefcase update

[helloworld] A atualizar o código da aplicação...
...

[helloworld] Aplicação atualizada.

Recompilar a aplicação:

(beeware-venv) $ briefcase build

[helloworld] A finalizar a configuração da aplicação...
...

[helloworld] A compilar a aplicação...
...

[helloworld] Compilado em build/helloworld/linux/ubuntu/jammy/helloworld-0.0.1/usr/bin/helloworld

E finalmente, correr a aplicação:

(beeware-venv) $ briefcase run

[helloworld] A iniciar a aplicação...
===========================================================================

No entanto, quando a aplicação é executada, vai ver um erro na consola:

Traceback (última chamada mais recente):
  Ficheiro "/usr/lib/python3.13/runpy.py", linha 194, em _run_module_as_main
    return _run_code(code, main_globals, None,
  Ficheiro "/usr/lib/python3.13/runpy.py", linha 87, em _run_code
    exec(code, run_globals)
  Ficheiro "/home/brutus/beeware-tutorial/helloworld/build/linux/ubuntu/jammy/helloworld-0.0.1/usr/app/hello_world/__main__.py", linha 1, em <module>
    from helloworld.app import main
  Ficheiro "/home/brutus/beeware-tutorial/helloworld/build/linux/ubuntu/jammy/helloworld-0.0.1/usr/app/hello_world/app.py", linha 8, em <module>
    import faker
ModuleNotFoundError: Nenhum módulo chamado 'faker'

Incapaz de iniciar a aplicação helloworld.

Atualizar o código na aplicação empacotada:

(beeware-venv) C:\...>briefcase update

[helloworld] A atualizar o código da aplicação...
...

[helloworld] Aplicação atualizada.

Recompilar a aplicação:

(beeware-venv) C:\...>briefcase build
...

[helloworld] Compilado em build\helloworld\windows\app\src\Toga Test.exe

E finalmente, correr a aplicação:

(beeware-venv) C:\...>briefcase run

[helloworld] A iniciar a aplicação...
===========================================================================

No entanto, quando a aplicação for executada, verá um erro na consola, além de um diálogo de falha:

Falha na aplicação Hello World Tutorial 7, no Windows

Atualizar o código na aplicação empacotada:

(beeware-venv) $ briefcase update android

[helloworld] A atualizar o código da aplicação...
...

[helloworld] Aplicação atualizada.

Recompilar a aplicação:

(beeware-venv) $ briefcase build android

[helloworld] A atualizar metadados da aplicação...
...
[helloworld] Compilado em build/helloworld/android/gradle/app/build/outputs/apk/debug/app-debug.apk

E finalmente, correr a aplicação (selecionando um simulador quando solicitado):

(beeware-venv) $ briefcase run android

[helloworld] Seguindo saída de relatório do dispositivo (tecle CTRL-C para interromper o relatório)...
===========================================================================

No entanto, quando a aplicação é executada, vai ver um erro na consola:

--------- início da falha
E/AndroidRuntime: EXCEPÇÃO FATAL: main
E/AndroidRuntime: Processo: com.example.helloworld, PID: 8289
E/AndroidRuntime: java.lang.RuntimeException: Não foi possível iniciar a atividade ComponentInfo{com.example.helloworld/org.beeware.android.MainActivity}: com.chaquo.python.PyException: ModuleNotFoundError: Nenhum módulo chamado 'faker'
E/AndroidRuntime:   em android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3635)
E/AndroidRuntime:   em android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792)
E/AndroidRuntime:   em android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
E/AndroidRuntime:   em android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
E/AndroidRuntime:   em android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
E/AndroidRuntime:   em android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210)
E/AndroidRuntime:   em android.os.Handler.dispatchMessage(Handler.java:106)
E/AndroidRuntime:   em android.os.Looper.loopOnce(Looper.java:201)
E/AndroidRuntime:   em android.os.Looper.loop(Looper.java:288)
E/AndroidRuntime:   em android.app.ActivityThread.main(ActivityThread.java:7839)
E/AndroidRuntime:   em java.lang.reflect.Method.invoke(Método Nativo)
E/AndroidRuntime:   em com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
E/AndroidRuntime:   em com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
E/AndroidRuntime: Causado por: com.chaquo.python.PyException: ModuleNotFoundError: Nenhum módulo chamado 'faker'
E/AndroidRuntime:   em <python>.helloworld.app.<module>(app.py:8)
E/AndroidRuntime:   em <python>.java.chaquopy.import_override(import.pxi:60)
E/AndroidRuntime:   em <python>.__main__.<module>(__main__.py:1)
E/AndroidRuntime:   em <python>.runpy._run_code(<frozen runpy>:88)
E/AndroidRuntime:   em <python>.runpy._run_module_code(<frozen runpy>:98)
E/AndroidRuntime:   em <python>.runpy.run_module(<frozen runpy>:226)
E/AndroidRuntime:   em <python>.chaquopy_java.call(chaquopy_java.pyx:352)
E/AndroidRuntime:   em <python>.chaquopy_java.Java_com_chaquo_python_PyObject_callAttrThrowsNative(chaquopy_java.pyx:324)
E/AndroidRuntime:   em com.chaquo.python.PyObject.callAttrThrowsNative(Método Nativo)
E/AndroidRuntime:   em com.chaquo.python.PyObject.callAttrThrows(PyObject.java:232)
E/AndroidRuntime:   em com.chaquo.python.PyObject.callAttr(PyObject.java:221)
E/AndroidRuntime:   em org.beeware.android.MainActivity.onCreate(MainActivity.java:85)
E/AndroidRuntime:   em android.app.Activity.performCreate(Activity.java:8051)
E/AndroidRuntime:   em android.app.Activity.performCreate(Activity.java:8031)
E/AndroidRuntime:   em android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
E/AndroidRuntime:   em android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3608)
E/AndroidRuntime:   ... mais 12
I/Process : A enviar sinal. PID: 8289 SIG: 9

Atualizar o código na aplicação empacotada:

(beeware-venv) $ briefcase update iOS

[helloworld] A atualizar o código da aplicação...
...

[helloworld] Aplicação atualizada.

Recompilar a aplicação:

(beeware-venv) $ briefcase build iOS

[helloworld] A atualizar os metadados da aplicação...
...
[helloworld] Compilado: build/helloworld/ios/xcode/build/Debug-iphonesimulator/Hello World.app

E finalmente, correr a aplicação (selecionando um simulador quando solicitado):

(beeware-venv) $ briefcase run iOS

...
[helloworld] Seguindo a saída do relatório do simulador (tecle CTRL-C para interromper o relatório)...
===========================================================================

No entanto, quando a aplicação correr, vai ver um erro na consola

A aplicação estoirou!
========================
Traceback (última chamada mais recente):
  Ficheiro "/Users/rkm/Library/Developer/CoreSimulator/Devices/FD7EA28A-6D72-4064-9D8A-53CC8308BB6F/data/Containers/Bundle/Application/D9DD590B-DA32-4EE1-8F78-78658379CAB7/Hello World.app/app/helloworld/__main__.py", linha 1, em <módulo>
    from helloworld.app import main
  Ficheiro "/Users/rkm/Library/Developer/CoreSimulator/Devices/FD7EA28A-6D72-4064-9D8A-53CC8308BB6F/data/Containers/Bundle/Application/D9DD590B-DA32-4EE1-8F78-78658379CAB7/Hello World.app/app/helloworld/app.py", linha 8, no <módulo>
    import faker
ModuleNotFoundError: Nenhum módulo chamado 'faker'

Mais uma vez, a aplicação não foi iniciada porque o faker não foi instalado - mas por quê? Não instalamos já o faker?

Sim, mas apenas no ambiente de desenvolvimento. Cada aplicação criada também tem o seu próprio ambiente independente, que é uma das coisas que o Briefcase produz quando executa briefcase build. Quando executamos briefcase dev -r, adicionamos faker ao nosso ambiente de desenvolvimento, mas não ao pacote da aplicação. Também precisamos correr briefcase update -r para que o Briefcase saiba que os requisitos do pacote da aplicação foram alterados:

(beeware-venv) $ briefcase update -r

[helloworld] A atualizar o código da aplicação...
A instalar src/hello_world...

[helloworld] A atualizar os requisitos...
A recolher faker
  A usar faker-37.3.0-py3-none-any.whl.metadata em cache (15 kB)
...
A instalar pacotes recolhidos: tzdata, travertino, std-nslog, rubicon-objc, fonttools, toga-core, faker, toga-cocoa
Instalado com sucesso: faker-37.3.0, fonttools-4.58.1, rubicon-objc-0.5.1, std-nslog-1.0.3, toga-cocoa-0.5.1, toga-core-0.5.1, travertino-0.5.1, tzdata-2025.2

[helloworld] A remover conteúdo desnecessário da aplicação...
...

[helloworld] Aplicação atualizada.
(beeware-venv) $ briefcase update -r

[helloworld] A finalizar a configuração da aplicação...
A direcionar para ubuntu:jammy (base do fornecedor: debian)
A determinar a versão do glibc... concluído
A direcionar para glibc 2.35
A direcionar para Python 3.13

[helloworld] A atualizar o código da aplicação...
A instalar src/hello_world...

[helloworld] A atualizar os requisitos...
A recolher faker
  A usar faker-37.3.0-py3-none-any.whl.metadata em cache (15 kB)
...
A instalar pacotes recolhidos: tzdata, travertino, std-nslog, rubicon-objc, fonttools, toga-core, faker, toga-cocoa
Instalado com sucesso: faker-37.3.0, fonttools-4.58.1, rubicon-objc-0.5.1, std-nslog-1.0.3, toga-cocoa-0.5.1, toga-core-0.5.1, travertino-0.5.1, tzdata-2025.2

[helloworld] A remover conteúdo desnecessário da aplicação...
...

[helloworld] Aplicação atualizada.
(beeware-venv) C:\...>briefcase update -r

[helloworld] A atualizar o código da aplicação...
A instalar src/helloworld...

[helloworld] A atualizar os requisitos...
A recolher faker
  A usar faker-37.3.0-py3-none-any.whl.metadata em cache (15 kB)
...
A instalar pacotes recolhidos: tzdata, travertino, std-nslog, rubicon-objc, fonttools, toga-core, faker, toga-cocoa
Instalado com sucesso: faker-37.3.0, fonttools-4.58.1, rubicon-objc-0.5.1, std-nslog-1.0.3, toga-cocoa-0.5.1, toga-core-0.5.1, travertino-0.5.1, tzdata-2025.2

[helloworld] A remover conteúdo desnecessário da aplicação...
...

[helloworld] Aplicação atualizada.
(beeware-venv) $ briefcase update android -r

[helloworld] A atualizar o código da aplicação...
A instalar src/helloworld... concluído

[helloworld] A atualizar os requisitos...
A gravar ficheiro de requisitos... concluído

[helloworld] A remover conteúdo desnecessário da aplicação...
A remover conteúdo desnecessário do pacote da aplicação... concluído

[helloworld] Aplicação atualizada.
(beeware-venv) $ briefcase update iOS -r

[helloworld] A atualizar o código da aplicação...
A instalar src/helloworld... concluído

[helloworld] A atualizar os requisitos...
A pesquisar nos índices: https://pypi.org/simple, https://pypi.anaconda.org/beeware/simple
A recolher o faker
  A usar o faker-37.4.0-py3-none-any.whl.metadata em cache (15 kB)
...

A instalar os requisitos da aplicação para o simulador do iPhone... concluído

[helloworld] A remover conteúdo desnecessário da aplicação...
A remover conteúdo desnecessário do pacote da aplicação... concluído

[helloworld] Aplicação atualizada.

Agora que atualizou, pode executar briefcase build e briefcase run - e deve ver a aplicação empacotada com o novo comportamento de diálogo.

Nota

A opção -r para atualizar os requisitos também é aceite pelos comandos build e run, assim se quiser atualizar, compilar e executar num único passo, pode usar briefcase run -u -r.

Pacotes Python de Terceiros para Dispositivos Móveis e Web

O Faker é apenas um exemplo de um pacote Python de terceiros - uma coleção de código que não faz parte do que o Python fornece de fábrica. Estes pacotes de terceiros são normalmente mais distribuídos usando o Python Package Index (PyPI) e instalados no seu ambiente virtual local. Neste tutorial, usamos o pip, mas há outras opções.

Em plataformas de ambiente de trabalho (macOS, Windows, Linux), basicamente qualquer pacote no PyPI pode ser instalado no seu ambiente virtual, ou adicionado aos requisitos da sua aplicação. No entanto, ao criar uma aplicação para plataformas móveis ou web, as suas opções são ligeiramente limitadas.

Resumindo; qualquer pacote puro Python (isto é, qualquer pacote criado a partir de um projeto escrito somente em Python) pode ser usado sem dificuldade. Alguns pacotes, entretanto, são criados a partir de projetos que contêm Python e outras linguagens (por exemplo, C, C++, Rust etc.). O código escrito nessas linguagens precisa ser compilado em módulos binários específicos da plataforma antes de poder ser usado, e esses módulos binários pré-compilados só estão disponíveis em plataformas específicas. As plataformas móveis e Web têm requisitos muito diferentes das plataformas de ambiente de trabalho "standard". No momento, a maioria dos pacotes Python não fornece binários pré-compilados para plataformas móveis e Web.

No PyPI, os pacotes geralmente são fornecidos num formato de distribuição pré-construído chamado wheels. Para verificar se um pacote é Python puro, veja a página de descargas do projeto no PyPI. Se os wheels fornecidos tiverem um sufixo -py3-none-any.whl (ex., Faker), então são wheels Python puros. No entanto, se os wheels tiverem extensões específicas de versão e da plataforma (ex., Pillow, que tem wheels com sufixos como -cp313-cp313-macosx_11_0_arm64.whl e -cp39-cp39-win_amd64.whl), então a wheel contém um componente binário. Esse pacote não pode ser instalado em plataformas móveis ou Web, a menos que seja fornecido um wheel compatível com essas plataformas.

No momento, a maioria dos pacotes binários no PyPI não fornecem wheels compatíveis com dispositivos móveis ou Web. Para preencher essa lacuna, o BeeWare fornece binários para alguns módulos binários populares (incluindo numpy, pandas e cryptography). Estes wheels não são distribuídos no PyPI, mas o Briefcase vai instalar estes wheels se estiverem disponíveis.

É geralmente possível compilar pacotes binário para plataformas móveis, mas isso não é fácil de configurar – e fica bem fora do escopo de um tutorial de introdução como este.

Próximos passos

Agora temos uma aplicação que usa uma biblioteca de terceiros! No Tutorial 8, aprenderemos a como garantir que a nossa aplicação permaneça funcional à medida que adicionamos lógica de aplicação mais complexa.