Saltar a contenido

Tutorial 7 - Poner en marcha esta (tercera-)fiesta

Hasta ahora, la aplicación que hemos construido sólo ha utilizado nuestro propio código, además del código proporcionado por BeeWare. Sin embargo, en una aplicación del mundo real, es probable que desees utilizar una biblioteca de terceros, descargada del Python Package Index (PyPI).

Vamos a modificar nuestra aplicación para incluir una biblioteca de terceros.

Añadir un paquete

Modifiquemos nuestra aplicación para que diga algo más que "¡Hola!".

Para generar un texto más interesante para el diálogo, vamos a utilizar una biblioteca llamada Faker. Faker es un paquete de Python que genera contenido falso, incluyendo nombres y bloques de texto. Los nombres y las palabras del bloque de texto se generan a partir de una lista arbitraria de palabras proporcionada por Faker. Vamos a utilizar Faker para construir un mensaje falso, como si alguien estuviera respondiendo al usuario.

Vamos a añadir una llamada a la API httpx a nuestra aplicación. Añade un import al principio de app.py para importar httpx:

import faker

Para hacer que nuestro tutorial sea asíncrono, modifica el manejador de eventos say_hello() para que se vea así:

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

Vamos a ejecutar nuestra aplicación actualizada en el modo de desarrollador de Briefcase para comprobar que nuestro cambio ha funcionado.

(beeware-venv) $ briefcase dev
Traceback (most recent call last):
File ".../venv/bin/briefcase", line 5, in <module>
    from briefcase.__main__ import main
File ".../venv/lib/python3.13/site-packages/briefcase/__main__.py", line 3, in <module>
    from .cmdline import parse_cmdline
File ".../venv/lib/python3.13/site-packages/briefcase/cmdline.py", line 6, in <module>
    from briefcase.commands import DevCommand, NewCommand, UpgradeCommand
File ".../venv/lib/python3.13/site-packages/briefcase/commands/__init__.py", line 1, in <module>
    from .build import BuildCommand  # noqa
File ".../venv/lib/python3.13/site-packages/briefcase/commands/build.py", line 5, in <module>
    from .base import BaseCommand, full_options
File ".../venv/lib/python3.13/site-packages/briefcase/commands/base.py", line 14, in <module>
    import faker
ModuleNotFoundError: No module named 'faker'
(beeware-venv) $ briefcase dev
Traceback (most recent call last):
File ".../venv/bin/briefcase", line 5, in <module>
    from briefcase.__main__ import main
File ".../venv/lib/python3.13/site-packages/briefcase/__main__.py", line 3, in <module>
    from .cmdline import parse_cmdline
File ".../venv/lib/python3.13/site-packages/briefcase/cmdline.py", line 6, in <module>
    from briefcase.commands import DevCommand, NewCommand, UpgradeCommand
File ".../venv/lib/python3.13/site-packages/briefcase/commands/__init__.py", line 1, in <module>
    from .build import BuildCommand  # noqa
File ".../venv/lib/python3.13/site-packages/briefcase/commands/build.py", line 5, in <module>
    from .base import BaseCommand, full_options
File ".../venv/lib/python3.13/site-packages/briefcase/commands/base.py", line 14, in <module>
    import faker
ModuleNotFoundError: No module named 'faker'
(beeware-venv) C:\...>briefcase dev
Traceback (most recent call last):
File "...\venv\bin\briefcase", line 5, in <module>
    from briefcase.__main__ import main
File "...\venv\lib\python3.13\site-packages\briefcase\__main__.py", line 3, in <module>
    from .cmdline import parse_cmdline
File "...\venv\lib\python3.13\site-packages\briefcase\cmdline.py", line 6, in <module>
    from briefcase.commands import DevCommand, NewCommand, UpgradeCommand
File "...\venv\lib\python3.13\site-packages\briefcase\commands\__init__.py", line 1, in <module>
    from .build import BuildCommand  # noqa
File "...\venv\lib\python3.13\site-packages\briefcase\commands\build.py", line 5, in <module>
    from .base import BaseCommand, full_options
File "...\venv\lib\python3.13\site-packages\briefcase\commands\base.py", line 14, in <module>
    import faker
ModuleNotFoundError: No module named 'faker'

No puedes ejecutar una aplicación Android en modo desarrollador: utiliza las instrucciones para la plataforma de escritorio que hayas elegido.

No puedes ejecutar una aplicación para iOS en modo desarrollador: sigue las instrucciones de la plataforma de escritorio que hayas elegido.

¿Qué ha pasado? Hemos añadido faker a nuestro código, pero no lo hemos añadido al entorno virtual que se utiliza para ejecutar la aplicación en modo de desarrollo.

Cuando Briefcase ejecuta una aplicación en modo de desarrollo, crea un entorno virtual independiente para esa aplicación, independiente del entorno en el que se ejecuta briefcase. Si tu aplicación no declara que necesita una biblioteca concreta, dicha biblioteca no se instalará en el entorno virtual de desarrollo.

Entonces, ¿cómo se añade un nuevo requisito a la solicitud?

Actualización de las dependencias

En el directorio raíz de tu aplicación, hay un archivo llamado pyproject.toml. Este archivo contiene todos los detalles de configuración de la aplicación que proporcionaste cuando ejecutaste briefcase new.

pyproject.toml está dividido en secciones; una de las secciones describe la configuración de tu aplicación:

[tool.briefcase.app.helloworld]
formal_name = "Hello World"
description = "A Tutorial app"
long_description = """More details about the app should go here.
"""
sources = ["src/helloworld"]
requires = []

La opción requires describe las dependencias de nuestra aplicación. Es una lista de cadenas que especifica las bibliotecas (y, opcionalmente, las versiones de las bibliotecas) que desea incluir en su aplicación.

Modifique la configuración requires para que diga:

requires = [
    "faker",
]

Al añadir esta opción, le estamos diciendo a Briefcase "cuando compiles mi aplicación, ejecuta pip install httpx en el paquete de la aplicación". Cualquier cosa que sea una entrada legal para pip install se puede utilizar aquí - por lo que podría especificar:

  • Una versión específica de la biblioteca (por ejemplo, "httpx==0.19.0");
  • Un rango de versiones de la biblioteca (por ejemplo, "httpx>=0.19");
  • Una ruta a un repositorio git (por ejemplo, "git+https://github.com/encode/httpx"); o bien
  • Una ruta de archivo local (No obstante, ten cuidado: si entregas tu código a otra persona, es probable que esta ruta no exista en su máquina)

Más abajo en pyproject.toml, verás otras secciones que dependen del sistema operativo, como [tool.briefcase.app.helloworld.macOS] y [tool.briefcase.app.helloworld.windows]. Estas secciones también tienen una configuración requires. Estas opciones te permiten definir dependencias adicionales específicas de la plataforma; así, por ejemplo, si necesitas una biblioteca específica de la plataforma para manejar algún aspecto de tu aplicación, puedes especificar esa biblioteca en la sección requires específica de la plataforma, y esa opción sólo se utilizará para esa plataforma. Notarás que las librerías toga están todas especificadas en la sección requires específica de la plataforma - esto es porque las librerías necesarias para mostrar una interfaz de usuario son específicas de la plataforma.

En nuestro caso, queremos que httpx se instale en todas las plataformas, por lo que utilizamos el parámetro requires a nivel de aplicación. Las dependencias a nivel de aplicación siempre se instalarán; las dependencias específicas de la plataforma se instalan además de las dependencias a nivel de aplicación.

Una vez que hayas añadido el nuevo requisito, guarda pyproject.toml y ejecuta briefcase dev -r. El indicador -r le indica a Briefcase que los requisitos han cambiado y que es necesario actualizar el entorno virtual de desarrollo:

(beeware-venv) $ briefcase dev -r

[helloworld] Activating dev environment...
...
Recreating virtual environment (dev.cpython-313-darwin)... done

[hello-world] Installing requirements...
...

[helloworld] Starting in dev mode...
===========================================================================

Cuando introduzcas un nombre y pulses el botón, deberías ver un cuadro de diálogo parecido a:

Hola Mundo Tutorial 7 diálogo, en macOS](../images/macOS/tutorial-7.png)

(beeware-venv) $ briefcase dev -r

[helloworld] Activating dev environment...
...
Recreating virtual environment (dev.cpython-313-x86_64-linux-gnu)... done

[hello-world] Installing requirements...
...

[helloworld] Starting in dev mode...
===========================================================================

Cuando introduzcas un nombre y pulses el botón, deberías ver un cuadro de diálogo parecido a:

Hola Mundo Tutorial 7 diálogo, en Linux

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

[helloworld] Activating dev environment...
...
Recreating virtual environment (dev.cp313-win_amd64)... done

[hello-world] Installing requirements...
...

[helloworld] Starting in dev mode...
===========================================================================

Cuando introduzcas un nombre y pulses el botón, deberías ver un cuadro de diálogo parecido a:

Hola Mundo Tutorial 7 diálogo, en Windows

No puedes ejecutar una aplicación Android en modo desarrollador: utiliza las instrucciones para la plataforma de escritorio que hayas elegido.

No puedes ejecutar una aplicación para iOS en modo desarrollador: sigue las instrucciones de la plataforma de escritorio que hayas elegido.

Posibles errores al ejecutar «briefcase dev»

Si sigues obteniendo un error al ejecutar briefcase dev, asegúrate de que:

  1. Has añadido faker a la lista requires en pyproject.toml;
  2. Has guardado los cambios en pyproject.toml; y
  3. Incluiste el argumento -r al ejecutar briefcase dev -r.

La primera vez que ejecutas tu aplicación utilizando briefcase dev, el argumento -r se añade automáticamente, por eso no hemos tenido que utilizar el argumento -r hasta ahora. El argumento -r solo es necesario cuando añades, eliminas o cambias un requisito, después de ejecutar tu aplicación en modo de desarrollo. Si solo has actualizado el código, puedes ejecutar briefcase dev como hemos estado haciendo durante el resto de este tutorial.

Ejecutar la aplicación actualizada

Ahora tenemos una aplicación que funciona, utilizando una biblioteca de terceros, ejecutándose en modo de desarrollo. Vamos a empaquetar este código de aplicación actualizado como una aplicación independiente. Dado que hemos realizado cambios en el código, debemos seguir los mismos pasos que en el Tutorial 4:

Actualice el código en la aplicación empaquetada:

(beeware-venv) $ briefcase update

[helloworld] Updating application code...
...

[helloworld] Application updated.

Reconstruye la aplicación:

(beeware-venv) $ briefcase build

[helloworld] Adhoc signing app...
[helloworld] Built build/helloworld/macos/app/Hello World.app

Y, por último, ejecute la aplicación:

(beeware-venv) $ briefcase run

[helloworld] Starting app...
===========================================================================

Sin embargo, cuando la aplicación se ejecute, verás un error en la consola y un cuadro de diálogo de bloqueo:

Fallo de la aplicación Hello World Tutorial 7, en macOS

Actualice el código en la aplicación empaquetada:

(beeware-venv) $ briefcase update

[helloworld] Updating application code...
...

[helloworld] Application updated.

Reconstruye la aplicación:

(beeware-venv) $ briefcase build

[helloworld] Finalizing application configuration...
...

[helloworld] Building application...
...

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

Y, por último, ejecute la aplicación:

(beeware-venv) $ briefcase run

[helloworld] Starting app...
===========================================================================

Sin embargo, cuando la aplicación se ejecute, verás un error en la consola:

Traceback (most recent call last):
  File "/usr/lib/python3.13/runpy.py", line 194, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/usr/lib/python3.13/runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "/home/brutus/beeware-tutorial/helloworld/build/linux/ubuntu/jammy/helloworld-0.0.1/usr/app/hello_world/__main__.py", line 1, in <module>
    from helloworld.app import main
  File "/home/brutus/beeware-tutorial/helloworld/build/linux/ubuntu/jammy/helloworld-0.0.1/usr/app/hello_world/app.py", line 8, in <module>
    import faker
ModuleNotFoundError: No module named 'faker'

Unable to start app helloworld.

Actualice el código en la aplicación empaquetada:

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

[helloworld] Updating application code...
...

[helloworld] Application updated.

Reconstruye la aplicación:

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

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

Y, por último, ejecute la aplicación:

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

[helloworld] Starting app...
===========================================================================

Sin embargo, cuando la aplicación se ejecute, verás un error en la consola y un cuadro de diálogo de bloqueo:

Fallo de la aplicación Hello World Tutorial 7, en Windows

Actualice el código en la aplicación empaquetada:

(beeware-venv) $ briefcase update android

[helloworld] Updating application code...
...

[helloworld] Application updated.

Reconstruye la aplicación:

(beeware-venv) $ briefcase build android

[helloworld] Updating app metadata...
...
[helloworld] Built build/helloworld/android/gradle/app/build/outputs/apk/debug/app-debug.apk

Por último, ejecute la aplicación (seleccionando un simulador cuando se le solicite):

(beeware-venv) $ briefcase run android

[helloworld] Following device log output (type CTRL-C to stop log)...
===========================================================================

Sin embargo, cuando la aplicación se ejecute, verás un error en la consola:

--------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: main
E/AndroidRuntime: Process: com.example.helloworld, PID: 8289
E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.helloworld/org.beeware.android.MainActivity}: com.chaquo.python.PyException: ModuleNotFoundError: No module named 'faker'
E/AndroidRuntime:   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3635)
E/AndroidRuntime:   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792)
E/AndroidRuntime:   at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
E/AndroidRuntime:   at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
E/AndroidRuntime:   at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
E/AndroidRuntime:   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210)
E/AndroidRuntime:   at android.os.Handler.dispatchMessage(Handler.java:106)
E/AndroidRuntime:   at android.os.Looper.loopOnce(Looper.java:201)
E/AndroidRuntime:   at android.os.Looper.loop(Looper.java:288)
E/AndroidRuntime:   at android.app.ActivityThread.main(ActivityThread.java:7839)
E/AndroidRuntime:   at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime:   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
E/AndroidRuntime:   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
E/AndroidRuntime: Caused by: com.chaquo.python.PyException: ModuleNotFoundError: No module named 'faker'
E/AndroidRuntime:   at <python>.helloworld.app.<module>(app.py:8)
E/AndroidRuntime:   at <python>.java.chaquopy.import_override(import.pxi:60)
E/AndroidRuntime:   at <python>.__main__.<module>(__main__.py:1)
E/AndroidRuntime:   at <python>.runpy._run_code(<frozen runpy>:88)
E/AndroidRuntime:   at <python>.runpy._run_module_code(<frozen runpy>:98)
E/AndroidRuntime:   at <python>.runpy.run_module(<frozen runpy>:226)
E/AndroidRuntime:   at <python>.chaquopy_java.call(chaquopy_java.pyx:352)
E/AndroidRuntime:   at <python>.chaquopy_java.Java_com_chaquo_python_PyObject_callAttrThrowsNative(chaquopy_java.pyx:324)
E/AndroidRuntime:   at com.chaquo.python.PyObject.callAttrThrowsNative(Native Method)
E/AndroidRuntime:   at com.chaquo.python.PyObject.callAttrThrows(PyObject.java:232)
E/AndroidRuntime:   at com.chaquo.python.PyObject.callAttr(PyObject.java:221)
E/AndroidRuntime:   at org.beeware.android.MainActivity.onCreate(MainActivity.java:85)
E/AndroidRuntime:   at android.app.Activity.performCreate(Activity.java:8051)
E/AndroidRuntime:   at android.app.Activity.performCreate(Activity.java:8031)
E/AndroidRuntime:   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
E/AndroidRuntime:   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3608)
E/AndroidRuntime:   ... 12 more
I/Process : Sending signal. PID: 8289 SIG: 9

Actualice el código en la aplicación empaquetada:

(beeware-venv) $ briefcase update iOS

[helloworld] Updating application code...
...

[helloworld] Application updated.

Reconstruye la aplicación:

(beeware-venv) $ briefcase build iOS

[helloworld] Updating app metadata...
...
[helloworld] Built build/helloworld/ios/xcode/build/Debug-iphonesimulator/Hello World.app

Por último, ejecute la aplicación (seleccionando un simulador cuando se le solicite):

(beeware-venv) $ briefcase run iOS

...
[helloworld] Following simulator log output (type CTRL-C to stop log)...
===========================================================================

Sin embargo, cuando la aplicación se ejecute, verás un error en la consola:

Application has crashed!
========================
Traceback (most recent call last):
  File "/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", line 1, in <module>
    from helloworld.app import main
  File "/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", line 8, in <module>
    import faker
ModuleNotFoundError: No module named 'faker'

Una vez más, la aplicación no se inicia porque no se ha instalado faker, pero ¿por qué? ¿No hemos instalado ya faker?

Sí, pero solo en el entorno de desarrollo. Cada aplicación compilada también tiene su propio entorno independiente, que es uno de los elementos que Briefcase genera al ejecutar briefcase build. Cuando ejecutamos briefcase dev -r, añadimos faker a nuestro entorno de desarrollo, pero no a la aplicación empaquetada. También tenemos que ejecutar briefcase update -r para que Briefcase sepa que los requisitos de la aplicación empaquetada han cambiado:

(beeware-venv) $ briefcase update -r

[helloworld] Updating application code...
Installing src/hello_world...

[helloworld] Updating requirements...
Collecting faker
  Using cached faker-37.3.0-py3-none-any.whl.metadata (15 kB)
...
Installing collected packages: tzdata, travertino, std-nslog, rubicon-objc, fonttools, toga-core, faker, toga-cocoa
Successfully installed 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] Removing unneeded app content...
...

[helloworld] Application updated.
(beeware-venv) $ briefcase update -r

[helloworld] Finalizing application configuration...
Targeting ubuntu:jammy (Vendor base debian)
Determining glibc version... done
Targeting glibc 2.35
Targeting Python3.13

[helloworld] Updating application code...
Installing src/hello_world...

[helloworld] Updating requirements...
Collecting faker
  Using cached faker-37.3.0-py3-none-any.whl.metadata (15 kB)
...
Installing collected packages: tzdata, travertino, std-nslog, rubicon-objc, fonttools, toga-core, faker, toga-cocoa
Successfully installed 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] Removing unneeded app content...
...

[helloworld] Application updated.
(beeware-venv) C:\...>briefcase update -r

[helloworld] Updating application code...
Installing src/helloworld...

[helloworld] Updating requirements...
Collecting faker
  Using cached faker-37.3.0-py3-none-any.whl.metadata (15 kB)
...
Installing collected packages: tzdata, travertino, std-nslog, rubicon-objc, fonttools, toga-core, faker, toga-cocoa
Successfully installed 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] Removing unneeded app content...
...

[helloworld] Application updated.
(beeware-venv) $ briefcase update android -r

[helloworld] Updating application code...
Installing src/helloworld... done

[helloworld] Updating requirements...
Writing requirements file... done

[helloworld] Removing unneeded app content...
Removing unneeded app bundle content... done

[helloworld] Application updated.
(beeware-venv) $ briefcase update iOS -r

[helloworld] Updating application code...
Installing src/helloworld... done

[helloworld] Updating requirements...
Looking in indexes: https://pypi.org/simple, https://pypi.anaconda.org/beeware/simple
Collecting faker
  Using cached faker-37.4.0-py3-none-any.whl.metadata (15 kB)
...

Installing app requirements for iPhone simulator... done

[helloworld] Removing unneeded app content...
Removing unneeded app bundle content... done

[helloworld] Application updated.

Una vez que haya actualizado, puede ejecutar briefcase build y briefcase run - y usted debe ver su aplicación empaquetada, con el nuevo comportamiento de diálogo.

Nota

La opción -r para actualizar los requisitos también es respetada por los comandos build y run, así que si quieres actualizar, construir y ejecutar en un solo paso, puedes usar briefcase run -u -r.

Paquetes Python de terceros para móviles y web

Faker es sólo un ejemplo de un paquete de Python de terceros - una colección de código que no es parte de lo que Python proporciona fuera de la caja. Estos paquetes de terceros se distribuyen normalmente usando el Python Package Index (PyPI), y se instalan en tu entorno virtual local. En este tutorial hemos utilizado pip, pero existen otras opciones.

En plataformas de escritorio (macOS, Windows, Linux), se puede añadir cualquier pip-instalable a sus requisitos. En plataformas móviles y web, las opciones son ligeramente limitadas.

En resumen; cualquier paquete puro Python (es decir, cualquier paquete creado a partir de un proyecto escrito sólo en Python) puede utilizarse sin dificultad. Algunos paquetes, sin embargo, se crean a partir de proyectos que contienen tanto Python como otros lenguajes (por ejemplo, C, C++, Rust, etc). El código escrito en esos lenguajes debe compilarse en módulos binarios específicos de la plataforma antes de poder utilizarse, y esos módulos binarios precompilados sólo están disponibles en plataformas específicas. Las plataformas móviles y web tienen requisitos muy diferentes a los de las plataformas de escritorio "estándar". En este momento, la mayoría de los paquetes de Python no proporcionan binarios precompilados para plataformas móviles y web.

En PyPI, los paquetes se proporcionan a menudo en un formato de distribución pre-construido llamado wheels. Para comprobar si un paquete es Python puro, mira en la página de descargas PyPI del proyecto. Si los wheels proporcionados tienen el sufijo -py3-none-any.whl (por ejemplo, Faker), entonces son wheels de Python puro. Sin embargo, si las ruedas tienen extensiones específicas de versión y plataforma (por ejemplo, Pillow, que tiene ruedas con sufijos como -cp313-cp313-macosx_11_0_arm64.whl y -cp39-cp39-win_amd64.whl), entonces la rueda contiene un componente binario. Ese paquete no puede instalarse en plataformas móviles o web a menos que se haya proporcionado una rueda compatible con esas plataformas.

En este momento, la mayoría de los paquetes binarios en PyPI no proporcionan ruedas compatibles con móviles o web. Para llenar este vacío, BeeWare proporciona binarios para algunos módulos binarios populares (incluyendo numpy, pandas, y cryptography). Estas ruedas no se distribuyen en PyPI, pero Briefcase instalará esas ruedas si están disponibles.

BeeWare puede proporcionar binarios para algunos módulos binarios populares (incluyendo numpy, pandas, y cryptography). Es normalmente posible compilar paquetes para plataformas móviles, pero no es fácil de configurar - fuera del alcance de un tutorial introductorio como éste.

Siguientes pasos

Ya tenemos una aplicación que utiliza una librería de terceros. En el Tutorial 8 aprenderemos cómo asegurarnos de que nuestra aplicación sigue respondiendo a medida que añadimos lógica de aplicación más compleja.