Esercitazione 4 - Aggiornamento dell’applicazione

Nell’ultima esercitazione abbiamo confezionato la nostra applicazione come applicazione nativa. Se avete a che fare con un’applicazione reale, la storia non finisce qui: probabilmente farete dei test, scoprirete dei problemi e dovrete apportare delle modifiche. Anche se la vostra applicazione è perfetta, alla fine vorrete pubblicare la versione 2 della vostra applicazione con dei miglioramenti.

Come si aggiorna l’applicazione installata quando si apportano modifiche al codice?

Aggiornamento del codice dell’applicazione

La nostra applicazione attualmente stampa sulla console quando si preme il pulsante. Tuttavia, le applicazioni GUI non dovrebbero utilizzare la console per l’output. Devono utilizzare le finestre di dialogo per comunicare con gli utenti.

Aggiungiamo una finestra di dialogo per dire ciao, invece di scrivere nella console. Modificare il callback say_hello in modo che assomigli a questo:

def say_hello(self, widget):
    self.main_window.info_dialog(
        f"Hello, {self.name_input.value}",
        "Hi there!",
    )

Questo indica a Toga di aprire una finestra di dialogo modale quando viene premuto il pulsante.

Se si esegue briefcase dev, si inserisce un nome e si preme il pulsante , si vedrà la nuova finestra di dialogo:

Esercitazione Hello World 4, su macOS

Tuttavia, se si esegue briefcase run, la finestra di dialogo non appare.

Perché? Beh, briefcase dev opera eseguendo il vostro codice sul posto - cerca di produrre un ambiente di runtime il più realistico possibile per il vostro codice, ma non fornisce o utilizza alcuna infrastruttura della piattaforma per avvolgere il vostro codice come un’applicazione. Parte del processo di impacchettamento dell’applicazione comporta la copia del codice nel bundle dell’applicazione e, al momento, l’applicazione contiene ancora il vecchio codice.

Quindi, dobbiamo dire a briefcase di aggiornare l’applicazione, copiando la nuova versione del codice. Potremmo farlo cancellando la vecchia cartella della piattaforma e ricominciando da zero. Tuttavia, Briefcase offre un modo più semplice: è possibile aggiornare il codice dell’applicazione esistente:

(beeware-venv) $ briefcase update

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

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

[helloworld] Application updated.

Se Briefcase non riesce a trovare il modello impalcabile, invocherà automaticamente create per generare un nuovo scaffold.

Ora che abbiamo aggiornato il codice dell’installatore, possiamo eseguire briefcase build per ricompilare l’applicazione, briefcase run per eseguire l’applicazione aggiornata e briefcase package per riconfezionare l’applicazione per la distribuzione.

(Per gli utenti di macOS, ricordate che, come indicato in Tutorial 3, per il tutorial si consiglia di eseguire il pacchetto briefcase con il flag --adhoc-sign per evitare la complessità di impostare un’identità di firma del codice e mantenere il tutorial il più semplice possibile)

Aggiornamento ed esecuzione in un unico passaggio

Se state iterando rapidamente le modifiche al codice, è probabile che vogliate apportare una modifica al codice, aggiornare l’applicazione e rieseguirla immediatamente. Per la maggior parte degli scopi, la modalità sviluppatore (briefcase dev`) è il modo più semplice per eseguire questo tipo di iterazione rapida; tuttavia, se si sta testando qualcosa sul modo in cui l’applicazione viene eseguita come binario nativo, o si sta cercando un bug che si manifesta solo quando l’applicazione è in forma pacchettizzata, potrebbe essere necessario utilizzare ripetute chiamate a briefcase run. Per semplificare il processo di aggiornamento ed esecuzione dell’applicazione in bundle, Briefcase ha una scorciatoia per supportare questo modello di utilizzo: l’opzione -u (o --update) del comando run.

Proviamo a fare un’altra modifica. Si sarà notato che se non si digita un nome nella casella di testo, la finestra di dialogo dirà «Ciao». Modifichiamo di nuovo la funzione say_hello per gestire questo caso limite.

All’inizio del file, tra le importazioni e la definizione della classe HelloWorld, aggiungiamo un metodo di utilità per generare un saluto appropriato a seconda del valore del nome fornito:

def greeting(name):
    if name:
        return f"Hello, {name}"
    else:
        return "Hello, stranger"

Quindi, modificare il callback say_hello per utilizzare questo nuovo metodo di utilità:

def say_hello(self, widget):
    self.main_window.info_dialog(
        greeting(self.name_input.value),
        "Hi there!",
    )

Eseguire l’applicazione in modalità di sviluppo (con briefcase dev) per verificare che la nuova logica funzioni; quindi aggiornare, compilare ed eseguire l’applicazione con un solo comando:

(beeware-venv) $ briefcase run -u

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

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

[helloworld] Application updated.

[helloworld] Building application...
...

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

[helloworld] Starting app...

Il comando package accetta anche l’argomento -u, per cui se si apporta una modifica al codice dell’applicazione e si desidera eseguire immediatamente il repackaging, si può eseguire briefcase package -u.

Prossimi passi

Ora abbiamo la nostra applicazione confezionata per la distribuzione su piattaforme desktop e siamo stati in grado di aggiornare il codice della nostra applicazione.

Ma che dire della telefonia mobile? In Tutorial 5, convertiremo la nostra applicazione in un’applicazione mobile e la distribuiremo su un simulatore di dispositivo e su un telefono.