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:

importa 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"Un messaggio da {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 (ultima chiamata più recente):
File ".../venv/bin/briefcase", riga 5, in <module>
    from briefcase.__main__ import main
File ".../venv/lib/python3.13/site-packages/briefcase/__main__.py", riga 3, in <module>
    from .cmdline import parse_cmdline
File ".../venv/lib/python3.13/site-packages/briefcase/cmdline.py", riga 6, in <module>
    da briefcase.commands import DevCommand, NewCommand, UpgradeCommand
File ".../venv/lib/python3.13/site-packages/briefcase/commands/__init__.py", riga 1, in <modulo>
    da .build import BuildCommand  # noqa
File ".../venv/lib/python3.13/site-packages/briefcase/commands/build.py", riga 5, in <module>
    da .base import BaseCommand, full_options
File ".../venv/lib/python3.13/site-packages/briefcase/commands/base.py", riga 14, in <module>
    import faker
ModuleNotFoundError: Nessun modulo denominato 'faker'
(beeware-venv) $ briefcase dev
Traceback (ultima chiamata più recente):
File ".../venv/bin/briefcase", riga 5, in <module>
    from briefcase.__main__ import main
File ".../venv/lib/python3.13/site-packages/briefcase/__main__.py", riga 3, in <module>
    from .cmdline import parse_cmdline
File ".../venv/lib/python3.13/site-packages/briefcase/cmdline.py", riga 6, in <module>
    da briefcase.commands import DevCommand, NewCommand, UpgradeCommand
File ".../venv/lib/python3.13/site-packages/briefcase/commands/__init__.py", riga 1, in <modulo>
    da .build import BuildCommand  # noqa
File ".../venv/lib/python3.13/site-packages/briefcase/commands/build.py", riga 5, in <module>
    da .base import BaseCommand, full_options
File ".../venv/lib/python3.13/site-packages/briefcase/commands/base.py", riga 14, in <module>
    import faker
ModuleNotFoundError: Nessun modulo denominato 'faker'
(beeware-venv) C:\...>briefcase dev
Traceback (ultima chiamata più recente):
File "...\venv\bin\briefcase", riga 5, in <module>
    from briefcase.__main__ import main
File "...\venv\lib\python3.13\site-packages\briefcase\__main__.py", riga 3, in <module>
    from .cmdline import parse_cmdline
File "...\venv\lib\python3.13\site-packages\briefcase\cmdline.py", riga 6, in <module>
    da briefcase.commands import DevCommand, NewCommand, UpgradeCommand
File "...\venv\lib\python3.13\site-packages\briefcase\commands\__init__.py", riga 1, in <modulo>
    da .build import BuildCommand  # noqa
File "...\venv\lib\python3.13\site-packages\briefcase\commands\build.py", riga 5, in <module>
    da .base import BaseCommand, full_options
File "...\venv\lib\python3.13\site-packages\briefcase\commands\base.py", riga 14, in <module>
    import faker
ModuleNotFoundError: Nessun modulo denominato '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 = "Un'app tutorial"
long_description = """Qui dovrebbero essere inseriti ulteriori dettagli sull'app.
"""
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] Attivazione dell'ambiente dev...
...
Ricreazione dell'ambiente virtuale (dev.cpython-313-darwin)... fatto

[hello-world] Installazione dei requisiti...
...

[helloworld] Avvio in modalità dev...
===========================================================================

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] Attivazione dell'ambiente di sviluppo...
...
Ricreazione dell'ambiente virtuale (dev.cpython-313-x86_64-linux-gnu)... completata

[hello-world] Installazione dei requisiti...
...

[helloworld] Avvio in modalità dev...
===========================================================================

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] Attivazione dell'ambiente di sviluppo...
...
Ricreazione dell'ambiente virtuale (dev.cp313-win_amd64)... completata

[hello-world] Installazione dei requisiti...
...

[helloworld] Avvio in modalità dev...
===========================================================================

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] Aggiornamento del codice dell'applicazione...
...

[helloworld] Applicazione aggiornata.

Ricostruire l'applicazione:

(beeware-venv) $ briefcase build

[helloworld] App di firma ad hoc...
[helloworld] Creato build/helloworld/macos/app/Hello World.app

Infine, eseguire l'applicazione:

(beeware-venv) $ briefcase run

[helloworld] Avvio dell'applicazione...
===========================================================================

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] Aggiornamento del codice dell'applicazione...
...

[helloworld] Applicazione aggiornata.

Ricostruire l'applicazione:

(beeware-venv) $ briefcase build

[helloworld] Completamento della configurazione dell'applicazione...
...

[helloworld] Compilazione dell'applicazione...
...

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

Infine, eseguire l'applicazione:

(beeware-venv) $ briefcase run

[helloworld] Avvio dell'applicazione...
===========================================================================

Tuttavia, quando l'applicazione viene eseguita, viene visualizzato un errore nella console:

Traceback (ultima chiamata più recente):
  File "/usr/lib/python3.13/runpy.py", riga 194, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/usr/lib/python3.13/runpy.py", riga 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", riga 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", riga 8, in <module>
    import faker
ModuleNotFoundError: Nessun modulo denominato 'faker'

Impossibile avviare l'app helloworld.

Aggiornare il codice dell'applicazione confezionata:

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

[helloworld] Aggiornamento del codice dell'applicazione in corso...
...

[helloworld] Applicazione aggiornata.

Ricostruire l'applicazione:

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

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

Infine, eseguire l'applicazione:

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

[helloworld] Avvio dell'applicazione...
===========================================================================

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] Aggiornamento del codice dell'applicazione in corso...
...

[helloworld] Applicazione aggiornata.

Ricostruire l'applicazione:

(beeware-venv) $ briefcase build android

[helloworld] Aggiornamento dei metadati dell'app...
...
[helloworld] Compilazione completata: 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] Di seguito l'output del log del dispositivo (premere CTRL-C per interrompere il log)...
===========================================================================

Tuttavia, quando l'applicazione viene eseguita, viene visualizzato un errore nella console:

--------- inizio dell'errore
E/AndroidRuntime: ECCEZIONE FATALE: main
E/AndroidRuntime: Processo: com.example.helloworld, PID: 8289
E/AndroidRuntime: java.lang.RuntimeException: Impossibile avviare l'attività ComponentInfo{com.example.helloworld/org.beeware.android.MainActivity}: com.chaquo.python.PyException: ModuleNotFoundError: Nessun modulo denominato 'faker'
E/AndroidRuntime:   in android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3635)
E/AndroidRuntime:   in android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792)
E/AndroidRuntime:   in android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
E/AndroidRuntime:   in android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
E/AndroidRuntime:   in android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
E/AndroidRuntime:   in android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210)
E/AndroidRuntime:   in android.os.Handler.dispatchMessage(Handler.java:106)
E/AndroidRuntime:   in android.os.Looper.loopOnce(Looper.java:201)
E/AndroidRuntime:   in android.os.Looper.loop(Looper.java:288)
E/AndroidRuntime:   in android.app.ActivityThread.main(ActivityThread.java:7839)
E/AndroidRuntime:   in java.lang.reflect.Method.invoke(Metodo nativo)
E/AndroidRuntime:   in com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
E/AndroidRuntime:   in com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
E/AndroidRuntime: Causato da: com.chaquo.python.PyException: ModuleNotFoundError: Nessun modulo denominato 'faker'
E/AndroidRuntime:   in <python>.helloworld.app.<module>(app.py:8)
E/AndroidRuntime:   in <python>.java.chaquopy.import_override(import.pxi:60)
E/AndroidRuntime:   in <python>.__main__.<module>(__main__.py:1)
E/AndroidRuntime:   in <python>.runpy._run_code(<frozen runpy>:88)
E/AndroidRuntime:   in <python>.runpy._run_module_code(<frozen runpy>:98)
E/AndroidRuntime:   in <python>.runpy.run_module(<frozen runpy>:226)
E/AndroidRuntime:   in <python>.chaquopy_java.call(chaquopy_java.pyx:352)
E/AndroidRuntime:   in <python>.chaquopy_java.Java_com_chaquo_python_PyObject_callAttrThrowsNative(chaquopy_java.pyx:324)
E/AndroidRuntime:   in com.chaquo.python.PyObject.callAttrThrowsNative(Metodo nativo)
E/AndroidRuntime:   in com.chaquo.python.PyObject.callAttrThrows(PyObject.java:232)
E/AndroidRuntime:   in com.chaquo.python.PyObject.callAttr(PyObject.java:221)
E/AndroidRuntime:   in org.beeware.android.MainActivity.onCreate(MainActivity.java:85)
E/AndroidRuntime:   in android.app.Activity.performCreate(Activity.java:8051)
E/AndroidRuntime:   in android.app.Activity.performCreate(Activity.java:8031)
E/AndroidRuntime:   in android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
E/AndroidRuntime:   in android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3608)
E/AndroidRuntime:   ... altri 12
I/Process : Invio del segnale. PID: 8289 SIG: 9

Aggiornare il codice dell'applicazione confezionata:

(beeware-venv) $ briefcase update iOS

[helloworld] Aggiornamento del codice dell'applicazione in corso...
...

[helloworld] Applicazione aggiornata.

Ricostruire l'applicazione:

(beeware-venv) $ briefcase build iOS

[helloworld] Aggiornamento dei metadati dell'app...
...
[helloworld] Creata 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] Di seguito il log del simulatore (premere CTRL-C per interrompere il log)...
===========================================================================

Tuttavia, quando l'applicazione viene eseguita, viene visualizzato un errore nella console:

L'applicazione si è bloccata!
========================
Traceback (ultima chiamata più recente):
  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", riga 1, in <modulo>
    da 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", riga 8, in <modulo>
    import faker
ModuleNotFoundError: Nessun modulo denominato '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] Aggiornamento del codice dell'applicazione...
Installazione di src/hello_world...

[helloworld] Aggiornamento dei requisiti...
Raccolta di faker
  Utilizzo di faker-37.3.0-py3-none-any.whl.metadata (15 kB) memorizzato nella cache
...
Installazione dei pacchetti raccolti: tzdata, travertino, std-nslog, rubicon-objc, fonttools, toga-core, faker, toga-cocoa
Installazione completata con successo di 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] Rimozione dei contenuti non necessari dell'app...
...

[helloworld] Applicazione aggiornata.
(beeware-venv) $ briefcase update -r

[helloworld] Completamento della configurazione dell'applicazione...
Destinazione ubuntu:jammy (base Debian del fornitore)
Determinazione della versione glibc... fatto
Destinazione glibc 2.35
Destinazione Python3.13

[helloworld] Aggiornamento del codice dell'applicazione...
Installazione di src/hello_world...

[helloworld] Aggiornamento dei requisiti...
Raccolta di faker
  Utilizzo di faker-37.3.0-py3-none-any.whl.metadata (15 kB) memorizzato nella cache
...
Installazione dei pacchetti raccolti: tzdata, travertino, std-nslog, rubicon-objc, fonttools, toga-core, faker, toga-cocoa
Installazione completata con successo di 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] Rimozione dei contenuti non necessari dell'app...
...

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

[helloworld] Aggiornamento del codice dell'applicazione...
Installazione di src/helloworld...

[helloworld] Aggiornamento dei requisiti...
Raccolta di faker
  Utilizzo di faker-37.3.0-py3-none-any.whl.metadata (15 kB) memorizzato nella cache
...
Installazione dei pacchetti raccolti: tzdata, travertino, std-nslog, rubicon-objc, fonttools, toga-core, faker, toga-cocoa
Installazione completata con successo di 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] Rimozione dei contenuti non necessari dell'app...
...

[helloworld] Applicazione aggiornata.
(beeware-venv) $ briefcase update android -r

[helloworld] Aggiornamento del codice dell'applicazione...
Installazione di src/helloworld... completata

[helloworld] Aggiornamento dei requisiti...
Scrittura del file dei requisiti... fatto

[helloworld] Rimozione dei contenuti non necessari dell'app...
Rimozione dei contenuti non necessari del bundle dell'app... fatto

[helloworld] Applicazione aggiornata.
(beeware-venv) $ briefcase update iOS -r

[helloworld] Aggiornamento del codice dell'applicazione...
Installazione di src/helloworld... completata

[helloworld] Aggiornamento dei requisiti...
Ricerca negli indici: https://pypi.org/simple, https://pypi.anaconda.org/beeware/simple
Raccolta di faker
  Utilizzo di faker-37.4.0-py3-none-any.whl.metadata (15 kB) memorizzato nella cache
...

Installazione dei requisiti dell'app per il simulatore iPhone... fatto

[helloworld] Rimozione dei contenuti non necessari dell'app...
Rimozione dei contenuti non necessari del bundle dell'app... fatto

[helloworld] Applicazione aggiornata.

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), praticamente qualsiasi pacchetto su PyPI può essere installato nel tuo ambiente virtuale o aggiunto ai requisiti della tua app. Tuttavia, quando crei un'app per piattaforme mobili o web, le tue 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.