Vai al contenuto

Esercitazione 7 - Iniziare questa (terza-)festa

Finora, l'applicazione che abbiamo costruito ha utilizzato solo il nostro codice e quello fornito da BeeWare. Tuttavia, in un'applicazione reale, è probabile che si voglia utilizzare una libreria di terze parti, scaricata dal Python Package Index (PyPI).

Modifichiamo la nostra applicazione per includere una libreria di terze parti.

Aggiunta di un pacchetto

Modifichiamo la nostra applicazione per dire qualcosa di più di un semplice "Ehilà!".

Per generare un testo più interessante per la finestra di dialogo, utilizzeremo una libreria chiamata Faker. Faker è un pacchetto Python che genera contenuti falsi, inclusi nomi e blocchi di testo. I nomi e le parole del blocco di testo sono generati da un elenco arbitrario di parole fornito da Faker. Useremo Faker per costruire un messaggio falso, come se qualcuno stesse rispondendo all'utente.

Aggiungiamo una chiamata API httpx alla nostra applicazione. Aggiungiamo un'importazione all'inizio di app.py per importare httpx:

import faker

Per rendere il nostro tutorial asincrono, modificare il gestore dell'evento say_hello() in modo che assomigli a questo:

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

Eseguiamo la nostra applicazione aggiornata in modalità sviluppatore di Briefcase per verificare che la nostra modifica abbia funzionato.

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

Non è possibile eseguire un'applicazione Android in modalità sviluppatore: utilizzare le istruzioni per la piattaforma desktop scelta.

Non è possibile eseguire un'app per iOS in modalità sviluppatore: utilizzare le istruzioni per la piattaforma desktop scelta.

Cosa è successo? Abbiamo aggiunto faker al nostro codice, ma non lo abbiamo aggiunto all'ambiente virtuale utilizzato per eseguire l'app in modalità di sviluppo.

Quando Briefcase esegue un'applicazione in modalità di sviluppo, crea un ambiente virtuale autonomo per quell'applicazione, indipendente dall'ambiente in cui si esegue briefcase. Se l'applicazione non dichiara di aver bisogno di una libreria particolare, tale libreria non verrà installata nell'ambiente virtuale di sviluppo.

Come si aggiunge un nuovo requisito alla propria applicazione?

Aggiornamento delle dipendenze

Nella directory principale dell'applicazione, c'è un file chiamato pyproject.toml. Questo file contiene tutti i dettagli di configurazione dell'applicazione forniti al momento dell'esecuzione di briefcase new.

il file pyproject.toml è suddiviso in sezioni; una delle sezioni descrive le impostazioni per l'applicazione:

[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'opzione requires descrive le dipendenze della nostra applicazione. Si tratta di un elenco di stringhe che specificano le librerie (e, facoltativamente, le versioni delle librerie) che desideri includere nella tua app.

Modificare l'impostazione requires in modo che si legga:

requires = [
    "faker",
]

Aggiungendo questa impostazione, si dice a Briefcase "quando costruisci la mia applicazione, esegui pip install httpx nel bundle dell'applicazione". Qualsiasi cosa che sia un input legale per pip install può essere usato qui, quindi si può specificare:

  • Una versione specifica della libreria (ad esempio, "httpx==0.19.0");
  • Un intervallo di versioni della libreria (ad esempio, "httpx>=0.19");
  • Un percorso a un repository git (ad esempio, git+https://github.com/encode/httpx"); oppure
  • Un percorso di file locale (tuttavia, attenzione: se si dà il codice a qualcun altro, questo percorso probabilmente non esisterà sulla sua macchina)

Più avanti in pyproject.toml, si noteranno altre sezioni che dipendono dal sistema operativo, come [tool.briefcase.app.helloworld.macOS] e [tool.briefcase.app.helloworld.windows]. Queste sezioni hanno anche un'impostazione requires. Queste impostazioni consentono di definire dipendenze aggiuntive specifiche per la piattaforma; quindi, ad esempio, se si ha bisogno di una libreria specifica per la piattaforma per gestire alcuni aspetti dell'applicazione, si può specificare tale libreria nella sezione requires specifica per la piattaforma, e tale impostazione sarà utilizzata solo per quella piattaforma. Si noterà che le librerie toga sono tutte specificate nella sezione requires specifica della piattaforma, perché le librerie necessarie per visualizzare l'interfaccia utente sono specifiche della piattaforma.

Nel nostro caso, vogliamo che httpx sia installato su tutte le piattaforme, quindi usiamo l'impostazione requires a livello di applicazione. Le dipendenze a livello di applicazione saranno sempre installate; le dipendenze specifiche della piattaforma sono installate in aggiunta a quelle a livello di applicazione.

Una volta aggiunto il nuovo requisito, salva pyproject.toml ed esegui briefcase dev -r. Il flag -r indica a Briefcase che i requisiti sono cambiati e che l'ambiente virtuale di sviluppo deve essere aggiornato:

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

Quando si inserisce un nome e si preme il pulsante, dovrebbe apparire una finestra di dialogo simile a questa:

Esercitazione Hello World 7, su 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...
===========================================================================

Quando si inserisce un nome e si preme il pulsante, dovrebbe apparire una finestra di dialogo simile a questa:

Esercitazione Hello World 7, su 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...
===========================================================================

Quando si inserisce un nome e si preme il pulsante, dovrebbe apparire una finestra di dialogo simile a questa:

Finestra di dialogo Hello World Tutorial 7, su
Windows

Non è possibile eseguire un'applicazione Android in modalità sviluppatore: utilizzare le istruzioni per la piattaforma desktop scelta.

Non è possibile eseguire un'app per iOS in modalità sviluppatore: utilizzare le istruzioni per la piattaforma desktop scelta.

Possibili errori durante l'esecuzione di briefcase dev

Se continui a ricevere un errore durante l'esecuzione di briefcase dev, assicurati che:

  1. Hai aggiunto faker all'elenco requires in pyproject.toml;
  2. Hai salvato le modifiche in pyproject.toml; e
  3. Hai incluso l'argomento -r durante l'esecuzione di briefcase dev -r.

La prima volta che esegui l'app utilizzando briefcase dev, l'argomento -r viene aggiunto automaticamente, ecco perché fino ad ora non abbiamo dovuto utilizzare l'argomento -r. L'argomento -r è necessario solo quando aggiungi, rimuovi o modifichi un requisito dopo aver eseguito l'applicazione in modalità di sviluppo. Se hai solo aggiornato il codice, puoi eseguire briefcase dev come abbiamo fatto nel resto di questo tutorial.

Esecuzione dell'applicazione aggiornata

Ora abbiamo un'applicazione funzionante, che utilizza una libreria di terze parti, in esecuzione in modalità di sviluppo. Procediamo con il pacchettizzazione di questo codice applicativo aggiornato come applicazione autonoma. Poiché abbiamo apportato modifiche al codice, dobbiamo seguire gli stessi passaggi indicati nel Tutorial 4:

Aggiornare il codice dell'applicazione confezionata:

(beeware-venv) $ briefcase update

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

[helloworld] Application updated.

Ricostruire l'applicazione:

(beeware-venv) $ briefcase build

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

Infine, eseguire l'applicazione:

(beeware-venv) $ briefcase run

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

Tuttavia, quando l'applicazione viene eseguita, viene visualizzato un errore nella console e una finestra di dialogo di arresto anomalo:

Arresto anomalo dell'applicazione Hello World Tutorial 7, su
macOS

Aggiornare il codice dell'applicazione confezionata:

(beeware-venv) $ briefcase update

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

[helloworld] Application updated.

Ricostruire l'applicazione:

(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

Infine, eseguire l'applicazione:

(beeware-venv) $ briefcase run

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

Tuttavia, quando l'applicazione viene eseguita, viene visualizzato un errore nella 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.

Aggiornare il codice dell'applicazione confezionata:

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

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

[helloworld] Application updated.

Ricostruire l'applicazione:

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

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

Infine, eseguire l'applicazione:

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

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

Tuttavia, quando l'applicazione viene eseguita, viene visualizzato un errore nella console e una finestra di dialogo di arresto anomalo:

Arresto anomalo dell'applicazione Hello World Tutorial 7, su
Windows

Aggiornare il codice dell'applicazione confezionata:

(beeware-venv) $ briefcase update android

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

[helloworld] Application updated.

Ricostruire l'applicazione:

(beeware-venv) $ briefcase build android

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

Infine, eseguire l'applicazione (selezionando un simulatore quando richiesto):

(beeware-venv) $ briefcase run android

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

Tuttavia, quando l'applicazione viene eseguita, viene visualizzato un errore nella 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

Aggiornare il codice dell'applicazione confezionata:

(beeware-venv) $ briefcase update iOS

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

[helloworld] Application updated.

Ricostruire l'applicazione:

(beeware-venv) $ briefcase build iOS

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

Infine, eseguire l'applicazione (selezionando un simulatore quando richiesto):

(beeware-venv) $ briefcase run iOS

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

Tuttavia, quando l'applicazione viene eseguita, viene visualizzato un errore nella 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'

Ancora una volta, l'applicazione non si è avviata perché faker non è stato installato - ma perché? Non abbiamo già installato faker?

Sì, ma solo nell'ambiente di sviluppo. Ogni applicazione creata ha anche un proprio ambiente autonomo, che è uno degli elementi generati da Briefcase quando si esegue briefcase build. Quando abbiamo eseguito briefcase dev -r, abbiamo aggiunto faker al nostro ambiente di sviluppo, ma non all'app pacchettizzata. Dobbiamo anche eseguire briefcase update -r affinché Briefcase riconosca che i requisiti dell'app pacchettizzata sono cambiati:

(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 volta effettuato l'aggiornamento, si può eseguire briefcase build e briefcase run e si dovrebbe vedere l'applicazione confezionata, con il nuovo comportamento della finestra di dialogo.

Nota

L'opzione -r per l'aggiornamento dei requisiti viene rispettata anche dai comandi build e run, quindi se si vuole aggiornare, compilare ed eseguire in un unico passaggio, si può usare briefcase run -u -r.

Pacchetti Python di terze parti per mobile e web

Faker è solo un esempio di pacchetto Python di terze parti, ovvero una raccolta di codice che non fa parte di ciò che Python fornisce in partenza. Questi pacchetti di terze parti sono comunemente distribuiti tramite Python Package Index (PyPI) e installati nell'ambiente virtuale locale. In questo tutorial abbiamo usato pip, ma ci sono altre opzioni.

Sulle piattaforme desktop (macOS, Windows, Linux), qualsiasi pip installabile può essere aggiunto ai requisiti. Sulle piattaforme mobili e web, le opzioni sono leggermente limitate.

In breve, qualsiasi pacchetto pure Python (cioè qualsiasi pacchetto creato da un progetto scritto solo in Python) può essere utilizzato senza problemi. Alcuni pacchetti, tuttavia, sono creati da progetti che contengono sia Python che altri linguaggi (ad esempio C, C++, Rust, ecc.). Il codice scritto in questi linguaggi deve essere compilato in moduli binari specifici per la piattaforma prima di poter essere utilizzato e questi moduli binari precompilati sono disponibili solo su piattaforme specifiche. Le piattaforme mobili e web hanno requisiti molto diversi dalle piattaforme desktop "standard". Al momento, la maggior parte dei pacchetti Python non fornisce binari precompilati per le piattaforme mobili e web.

Su PyPI, i pacchetti sono spesso forniti in un formato di distribuzione precostituito chiamato wheels. Per verificare se un pacchetto è puro Python, guardate la pagina dei download di PyPI per il progetto. Se le ruote fornite hanno il suffisso -py3-none-any.whl (per esempio, Faker), allora sono ruote Python pure. Tuttavia, se le ruote hanno estensioni specifiche per versione e piattaforma (per esempio, Pillow, che ha ruote con suffissi come -cp313-cp313-macosx_11_0_arm64.whl e -cp39-cp39-win_amd64.whl), allora la ruota contiene un componente binario. Questo pacchetto non può essere installato su piattaforme mobili o web, a meno che non sia stata fornita una versione compatibile con tali piattaforme.

Al momento, la maggior parte dei pacchetti binari su PyPI non fornisce ruote compatibili con i cellulari o il web. Per colmare questa lacuna, BeeWare fornisce i binari per alcuni moduli binari popolari (tra cui numpy, pandas e cryptography). Questi binari non sono distribuiti su PyPI, ma Briefcase li installerà se sono disponibili.

BeeWare può fornire binari per alcuni moduli binari popolari (tra cui numpy, pandas e cryptography). È di solito possibile compilare pacchetti per le piattaforme mobili, ma non è facile da configurare, il che esula dallo scopo di un tutorial introduttivo come questo.

Prossimi passi

Ora abbiamo un'applicazione che utilizza una libreria di terze parti! In Tutorial 8 impareremo a garantire che la nostra applicazione rimanga reattiva man mano che aggiungiamo una logica applicativa più complessa.