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:
- Has añadido
fakera la listarequiresenpyproject.toml; - Has guardado los cambios en
pyproject.toml; y - Incluiste el argumento
-ral ejecutarbriefcase 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.