Aller au contenu

Tutoriel n° 7 - Démarrer cette (troisième-)partie

Jusqu'à présent, l'application que nous avons construite n'a utilisé que notre propre code, ainsi que le code fourni par BeeWare. Cependant, dans une application réelle, vous voudrez probablement utiliser une bibliothèque tierce, téléchargée à partir du Python Package Index (PyPI).

Modifions notre application pour y inclure une bibliothèque tierce.

Ajout d'un paquet

Modifions notre application pour qu'elle dise un peu plus que "Bonjour !".

Pour générer un texte plus intéressant pour le dialogue, nous allons utiliser une bibliothèque appelée Faker. Faker est un paquetage Python qui génère du faux contenu, y compris des noms et des blocs de texte. Les noms et les mots du bloc de texte sont générés à partir d'une liste arbitraire de mots fournie par Faker. Nous allons utiliser Faker pour construire un faux message, comme si quelqu'un répondait à l'utilisateur.

Commençons par ajouter faker à notre application. Ajoutez un import au début de app.py pour importer faker :

import faker

Puis modifiez le callback say_hello() pour qu'il ressemble à ceci :

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()}",
        )
    )

Exécutons notre application mise à jour dans le mode développeur de Briefcase pour vérifier que notre changement a fonctionné.

(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'

Vous ne pouvez pas exécuter une application Android en mode développeur - utilisez les instructions pour la plateforme de bureau que vous avez choisie.

Vous ne pouvez pas exécuter une application iOS en mode développeur - utilisez les instructions pour la plateforme de bureau que vous avez choisie.

Que s'est-il passé ? Nous avons ajouté faker à notre code, mais nous ne l'avons pas ajouté à l'environnement virtuel utilisé pour exécuter l'application en mode développement.

Lorsque Briefcase exécute une application en mode développement, il crée un environnement virtuel autonome pour cette application, indépendant de l'environnement dans lequel vous exécutez briefcase. Si votre application ne déclare pas avoir besoin d'une bibliothèque particulière, cette bibliothèque ne sera pas installée dans l'environnement virtuel de développement.

Alors, comment ajouter une nouvelle exigence à votre application ?

Mise à jour des dépendances

Dans le répertoire racine de votre application, il y a un fichier nommé pyproject.toml. Ce fichier contient tous les détails de configuration de l'application que vous avez fournis lorsque vous avez lancé briefcase new.

pyproject.toml est divisé en sections ; l'une d'entre elles décrit les paramètres de votre application :

[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 = []

L'option requires décrit les dépendances de notre application. Il s'agit d'une liste de chaînes de caractères spécifiant les bibliothèques (et, éventuellement, les versions des bibliothèques) que vous souhaitez inclure dans votre application.

Modifiez le paramètre requires de façon à ce qu'il se lise :

requires = [
    "faker",
]

En ajoutant ce paramètre, nous disons à Briefcase : "lorsque vous compilez mon application, lancez pip install faker dans le bundle de l'application". Tout ce qui serait une entrée légale pour pip install peut être utilisé ici - ainsi, vous pourriez spécifier :

  • Une version spécifique de la bibliothèque (par exemple, "faker==37.3.0") ;
  • Une gamme de versions de la bibliothèque (par exemple, "faker>=37") ;
  • Un chemin vers un dépôt git (par exemple, "git+https://github.com/joke2k/faker/") ; ou
  • Un chemin d'accès à un fichier local (Cependant, attention : si vous donnez votre code à quelqu'un d'autre, ce chemin d'accès n'existera probablement pas sur sa machine !)

Plus loin dans pyproject.toml, vous remarquerez d'autres sections qui dépendent du système d'exploitation, comme [tool.briefcase.app.helloworld.macOS] et [tool.briefcase.app.helloworld.windows]. Ces sections ont également un paramètre requires. Ces paramètres vous permettent de définir des dépendances supplémentaires spécifiques à une plate-forme - ainsi, par exemple, si vous avez besoin d'une bibliothèque spécifique à une plate-forme pour gérer un aspect de votre application, vous pouvez spécifier cette bibliothèque dans la section requires'' spécifique à la plate-forme, et ce paramètre ne sera utilisé que pour cette plate-forme. Vous remarquerez que les bibliothèquestogasont toutes spécifiées dans la sectionrequires` spécifique à la plate-forme - c'est parce que les bibliothèques nécessaires pour afficher une interface utilisateur sont spécifiques à la plate-forme.

Dans notre cas, nous voulons que faker soit installé sur toutes les plateformes, donc nous utilisons le paramètre requires au niveau de l'application. Les dépendances au niveau de l'application seront toujours installées ; les dépendances spécifiques à la plate-forme sont installées en plus de celles au niveau de l'application.

Une fois que vous avez ajouté la nouvelle exigence, enregistrez pyproject.toml et exécutez briefcase dev -r. Le drapeau -r indique à Briefcase que les exigences ont changé et que l'environnement virtuel de développement doit être mis à jour :

(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...
===========================================================================

Lorsque vous entrez un nom et que vous appuyez sur le bouton, une boîte de dialogue doit s'afficher :

Tutoriel Hello World 7 dialogue, sur macOS

(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...
===========================================================================

Lorsque vous entrez un nom et que vous appuyez sur le bouton, une boîte de dialogue doit s'afficher :

Tutoriel Hello World 7 dialogue, sur 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...
===========================================================================

Lorsque vous entrez un nom et que vous appuyez sur le bouton, une boîte de dialogue doit s'afficher :

Tutoriel Hello World 7 dialogue, sur Windows

Vous ne pouvez pas exécuter une application Android en mode développeur - utilisez les instructions pour la plateforme de bureau que vous avez choisie.

Vous ne pouvez pas exécuter une application iOS en mode développeur - utilisez les instructions pour la plateforme de bureau que vous avez choisie.

Erreurs possibles lors de l'exécution de « briefcase dev »

Si vous obtenez toujours une erreur lors de l'exécution de briefcase dev, assurez-vous que :

  1. Vous avez ajouté faker à la liste requires dans pyproject.toml;
  2. Vous avez enregistré vos modifications dans pyproject.toml; et
  3. Vous avez inclus l'argument -r lors de l'exécution de briefcase dev -r.

La toute première fois que vous exécutez votre application à l'aide de briefcase dev, l'argument -r est automatiquement ajouté pour vous. C'est pourquoi nous n'avons pas eu à utiliser l'argument -r jusqu'à présent. L'argument -r n'est nécessaire que lorsque vous ajoutez, supprimez ou modifiez une exigence, après avoir exécuté votre application en mode développement. Si vous avez uniquement mis à jour le code, vous pouvez exécuter briefcase dev comme nous l'avons fait tout au long de ce tutoriel.

Exécution de l'application mise à jour

Nous disposons désormais d'une application fonctionnelle, utilisant une bibliothèque tierce, qui s'exécute en mode développement. Intégrons ce code d'application mis à jour dans une application autonome. Étant donné que nous avons apporté des modifications au code, nous devons suivre les mêmes étapes que dans le Tutoriel 4 :

Mettre à jour le code dans l'application packagée :

(beeware-venv) $ briefcase update

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

[helloworld] Application updated.

Reconstruire l'application :

(beeware-venv) $ briefcase build

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

Enfin, lancez l'application :

(beeware-venv) $ briefcase run

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

Cependant, lorsque l'application s'exécute, vous verrez une erreur dans la console, ainsi qu'une boîte de dialogue de plantage :

Plantage de l'application Hello World Tutorial 7, sur macOS

Mettre à jour le code dans l'application packagée :

(beeware-venv) $ briefcase update

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

[helloworld] Application updated.

Reconstruire l'application :

(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

Enfin, lancez l'application :

(beeware-venv) $ briefcase run

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

Cependant, lorsque l'application s'exécute, une erreur apparaît dans la console :

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.

Mettre à jour le code dans l'application packagée :

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

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

[helloworld] Application updated.

Reconstruire l'application :

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

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

Enfin, lancez l'application :

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

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

Cependant, lorsque l'application s'exécute, vous verrez une erreur dans la console, ainsi qu'une boîte de dialogue de plantage :

Plantage de l'application Hello World Tutorial 7, sur Windows

Mettre à jour le code dans l'application packagée :

(beeware-venv) $ briefcase update android

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

[helloworld] Application updated.

Reconstruire l'application :

(beeware-venv) $ briefcase build android

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

Enfin, exécutez l'application (en sélectionnant un simulateur lorsque vous y êtes invité) :

(beeware-venv) $ briefcase run android

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

Cependant, lorsque l'application s'exécute, une erreur apparaît dans la console :

--------- 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

Mettre à jour le code dans l'application packagée :

(beeware-venv) $ briefcase update iOS

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

[helloworld] Application updated.

Reconstruire l'application :

(beeware-venv) $ briefcase build iOS

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

Enfin, exécutez l'application (en sélectionnant un simulateur lorsque vous y êtes invité) :

(beeware-venv) $ briefcase run iOS

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

Cependant, lorsque l'application s'exécute, une erreur apparaît dans la console

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'

Une fois de plus, l'application n'a pas démarré parce que faker n'a pas été installé - mais pourquoi ? N'avons-nous pas déjà installé faker ?

Oui, mais uniquement dans l'environnement de développement. Chaque application créée dispose également de son propre environnement autonome, qui est l'un des éléments générés par Briefcase lorsque vous exécutez briefcase build. Lorsque nous avons exécuté briefcase dev -r, nous avons ajouté faker à notre environnement de développement, mais pas à l'application packagée. Nous devons également exécuter briefcase update -r afin que Briefcase sache que les exigences de l'application packagée ont changé :

(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.

Une fois la mise à jour effectuée, vous pouvez lancer briefcase build et briefcase run - et vous devriez voir votre application packagée, avec le nouveau comportement du dialogue.

Note

L'option -r pour la mise à jour des exigences est également honorée par les commandes build et run, donc si vous voulez mettre à jour, compiler et exécuter en une seule étape, vous pouvez utiliser briefcase run -u -r.

Paquets Python tiers pour les mobiles et le Web

Faker n'est qu'un exemple de paquetage Python tiers - une collection de code qui ne fait pas partie de ce que Python fournit en standard. Ces paquets tiers sont le plus souvent distribués via le Python Package Index (PyPI), et installés dans votre environnement virtuel local. Nous avons utilisé pip dans ce tutoriel, mais il existe d'autres options.

Sur les plateformes de bureau (macOS, Windows, Linux), pratiquement tout package de PyPi peut être installé dans votre environnement virtuel, ou être ajouté aux exigences de votre application. Sur les plateformes mobiles et web, vos options sont légèrement limitées.

En bref, tout paquetage purement Python (c'est-à-dire tout paquetage créé à partir d'un projet écrit uniquement en Python) peut être utilisé sans difficulté. Certains paquets, cependant, sont créés à partir de projets contenant à la fois Python et d'autres langages (par exemple C, C++, Rust, etc.). Le code écrit dans ces langages doit être compilé en modules binaires spécifiques à la plateforme avant de pouvoir être utilisé, et ces modules binaires précompilés ne sont disponibles que sur des plateformes spécifiques. Les plateformes mobiles et web ont des exigences très différentes de celles des plateformes de bureau "standard". À l'heure actuelle, la plupart des paquets Python ne fournissent pas de binaires précompilés pour les plateformes mobiles et web.

Sur PyPI, les paquets sont souvent fournis dans un format de distribution préconstruit appelé wheels. Pour vérifier si un paquet est purement Python, regardez la page de téléchargements PyPI pour le projet. Si les roues fournies ont un suffixe -py3-none-any.whl (par exemple, Faker), alors ce sont des roues purement Python. Cependant, si les roues ont des extensions spécifiques à la version et à la plateforme (par exemple, Pillow, qui a des roues avec des suffixes comme -cp313-cp313-macosx_11_0_arm64.whl et -cp39-cp39-win_amd64.whl), alors la roue contient un composant binaire. Ce paquet ne peut pas être installé sur des plateformes mobiles ou web à moins qu'une roue compatible avec ces plateformes n'ait été fournie.

A l'heure actuelle, la plupart des paquets binaires sur PyPI ne fournissent pas de roues compatibles avec les mobiles ou le web. Pour combler cette lacune, BeeWare fournit des binaires pour certains modules binaires populaires (y compris numpy, pandas, et cryptography). Ces roues ne sont pas distribuées sur PyPI, mais Briefcase les installera si elles sont disponibles.

Il est habituellement possible de compiler des paquets binaires pour les plateformes mobiles, mais ce n'est pas facile à mettre en place – ce qui sort du cadre d'un tutoriel d'introduction comme celui-ci.

Étapes suivantes

Nous avons maintenant une application qui utilise une bibliothèque tierce ! Dans le Tutoriel 8, nous apprendrons à nous assurer que notre application reste réactive lorsque nous ajoutons une logique d'application plus complexe.