Zum Inhalt

Tutorial 4 - Aktualisieren Ihrer Anwendung

Im letzten Tutorial haben wir unsere Anwendung als native Anwendung gepackt. Wenn Sie mit einer realen Anwendung arbeiten, ist das noch nicht das Ende der Geschichte – Sie werden wahrscheinlich einige Tests durchführen, Probleme entdecken und Änderungen vornehmen müssen. Selbst wenn Ihre Anwendung perfekt ist, werden Sie irgendwann eine verbesserte Version 2 Ihrer Anwendung veröffentlichen wollen.

Also – wie aktualisieren Sie Ihre installierte App, wenn Sie Änderungen am Code vornehmen?

Aktualisierung des Anwendungscodes

Unsere Anwendung gibt derzeit eine Meldung auf der Konsole aus, wenn Sie die Schaltfläche drücken. GUI-Anwendungen sollten jedoch nicht wirklich die Konsole für die Ausgabe verwenden. Sie müssen Dialoge verwenden, um mit Benutzern zu kommunizieren.

Fügen wir ein Dialogfeld hinzu, um Hallo zu sagen, anstatt in die Konsole zu schreiben. Ändern Sie den say_hello Callback so, dass er wie folgt aussieht:

async def say_hello(self, widget):
    await self.main_window.dialog(
        toga.InfoDialog(
            f"Hello, {self.name_input.value}",
            "Hi there!",
        )
    )

Wir müssen die Methode async so gestalten, dass der Rest der Anwendung weiterläuft, wenn wir den Dialog anzeigen. Kümmern Sie sich jetzt nicht zu sehr um dieses Detail - wir werden in Tutorial 8 eine ausführlichere Erklärung geben.

Dadurch wird Toga angewiesen, ein modales Dialogfeld zu öffnen, wenn die Schaltfläche gedrückt wird.

Wenn Sie briefcase dev ausführen, einen Namen eingeben und auf die Schaltfläche klicken, wird das neue Dialogfeld angezeigt:

Hello World Tutorial 4 dialog, auf macOS

Hello World Tutorial 4 Dialog, unter Linux

Hello World Tutorial 4 Dialog, unter
Windows

Wenn Sie jedoch briefcase run ausführen, wird das Dialogfeld nicht angezeigt.

Warum ist das so? Nun, briefcase dev führt Ihren Code an Ort und Stelle aus - es versucht, eine möglichst realistische Laufzeitumgebung für Ihren Code zu erzeugen, aber es stellt keine Plattforminfrastruktur für die Verpackung Ihres Codes als Anwendung zur Verfügung oder nutzt diese. Ein Teil des Prozesses der Paketierung Ihrer Anwendung beinhaltet das Kopieren Ihres Codes in das Anwendungsbündel - und im Moment hat Ihre Anwendung noch den alten Code in sich.

Wir müssen also briefcase anweisen, Ihre Anwendung zu aktualisieren, indem wir die neue Version des Codes hineinkopieren. Wir könnten dies tun, indem wir das alte Plattformverzeichnis löschen und von vorne beginnen. Briefcase bietet jedoch einen einfacheren Weg - Sie können den Code für Ihre bestehende gebündelte Anwendung aktualisieren:

(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.
(beeware-venv) $ briefcase update

[helloworld] Finalizing application configuration...
Targeting ubuntu:jammy (Vendor base debian)
Determining glibc version... done
Targeting glibc 2.35
Targeting Python3.10

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

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


[helloworld] Application updated.
(beeware-venv) C:\...>briefcase update

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

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

[helloworld] Application updated.

Wenn Briefcase die gerüstete Vorlage nicht finden kann, ruft es automatisch create auf, um ein neues Gerüst zu erzeugen.

Nun, da wir den Installationscode aktualisiert haben, können wir briefcase build ausführen, um die Anwendung neu zu kompilieren, briefcase run, um die aktualisierte Anwendung zu starten, und briefcase package, um die Anwendung für die Verteilung neu zu verpacken.

Hinweis

(macOS-Benutzer sollten bedenken, dass wir, wie in Tutorial 3 erwähnt, für das Tutorial empfehlen, briefcase package mit dem --adhoc-sign-Flag auszuführen, um die Komplexität der Einrichtung einer Code-Signatur-Identität zu vermeiden und das Tutorial so einfach wie möglich zu halten)

Aktualisierung und Ausführung in einem Schritt

Wenn Sie Code-Änderungen schnell iterieren, werden Sie wahrscheinlich eine Code-Änderung vornehmen, die Anwendung aktualisieren und sie sofort wieder ausführen wollen. Für die meisten Zwecke ist der Entwicklermodus (briefcase dev) der einfachste Weg, diese Art der schnellen Iteration durchzuführen. Wenn Sie jedoch etwas darüber testen, wie Ihre Anwendung als native Binärdatei läuft, oder einen Fehler suchen, der nur auftritt, wenn Ihre Anwendung in gepackter Form vorliegt, müssen Sie möglicherweise wiederholte Aufrufe von briefcase run verwenden. Um den Prozess des Aktualisierens und Ausführens der gebündelten Anwendung zu vereinfachen, hat Briefcase eine Abkürzung, die dieses Verwendungsmuster unterstützt - die -u (oder --update) Option auf dem run Befehl.

Versuchen wir, eine weitere Änderung vorzunehmen. Sie haben vielleicht bemerkt, dass das Dialogfeld "Hallo" sagt, wenn Sie keinen Namen in das Texteingabefeld eingeben. Ändern wir die Funktion "say_hello" erneut, um diesen Sonderfall zu behandeln.

Am Anfang der Datei, zwischen den Importen und der class HelloWorld-Definition, fügen Sie eine Utility-Methode hinzu, um eine entsprechende Begrüßung in Abhängigkeit vom Wert des angegebenen Namens zu erzeugen:

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

Ändern Sie dann den "say_hello"-Callback, um diese neue Dienstprogramm-Methode zu verwenden:

async def say_hello(self, widget):
    await self.main_window.dialog(
        toga.InfoDialog(
            greeting(self.name_input.value),
            "Hi there!",
        )
    )

Führen Sie Ihre Anwendung im Entwicklungsmodus aus (mit briefcase dev), um zu bestätigen, dass die neue Logik funktioniert; dann aktualisieren, bauen und starten Sie die Anwendung mit einem Befehl:

(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...
(beeware-venv) $ briefcase run -u

[helloworld] Finalizing application configuration...
Targeting ubuntu:jammy (Vendor base debian)
Determining glibc version... done
Targeting glibc 2.35
Targeting Python3.10

[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/linux/ubuntu/jammy/helloworld-0.0.1/usr/bin/helloworld

[helloworld] Starting app...
(beeware-venv) C:\...>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] Starting app...

Der Befehl package akzeptiert auch das Argument -u. Wenn Sie also eine Änderung an Ihrem Anwendungscode vornehmen und sofort neu packen wollen, können Sie briefcase package -u ausführen.

Nächste Schritte

Wir haben unsere Anwendung jetzt für die Verteilung auf Desktop-Plattformen verpackt und konnten den Code in unserer Anwendung aktualisieren.

Aber was ist mit mobilen Geräten? In Tutorial 5 werden wir unsere Anwendung in eine mobile Anwendung umwandeln und sie auf einem Gerätesimulator und auf einem Telefon einsetzen.