Tutorial 7 – Starten Sie diese (Dritt-)Anwendung¶
Bisher hat die von uns entwickelte App nur unseren eigenen Code sowie den von BeeWare bereitgestellten Code verwendet. In einer realen App werden Sie jedoch wahrscheinlich eine Bibliothek eines Drittanbieters verwenden wollen, die Sie aus dem Python Package Index (PyPI) herunterladen können.
Lassen Sie uns unsere App so ändern, dass sie eine Bibliothek eines Drittanbieters enthält.
Paket hinzufügen¶
Lassen Sie uns unsere Anwendung so ändern, dass sie etwas mehr sagt als nur „Hallo!“.
Um einen interessanteren Text für das Dialogfeld zu erzeugen, werden wir eine Bibliothek namens Faker verwenden. Faker ist ein Python-Paket, das gefälschte Inhalte, einschließlich Namen und Textblöcke, erzeugt. Die Namen und Wörter in den Textblöcken werden aus einer beliebigen Liste von Wörtern generiert, die von Faker bereitgestellt wird. Wir werden Faker verwenden, um eine gefälschte Nachricht zu erstellen, als ob jemand dem Benutzer antwortet.
Fügen wir einen httpx-API-Aufruf zu unserer Anwendung hinzu. Fügen Sie einen
Import am Anfang der app.py hinzu, um httpx zu importieren:
import faker
Dann ändern Sie den Callback say_hello() so, dass er wie folgt aussieht:
async def say_hello(self, widget):
fake = faker.Faker()
await self.main_window.dialog(
toga.InfoDialog(
greeting(self.name_input.value),
f"Eine Nachricht von {fake.name()}: {fake.text()}",
)
)
Führen wir unsere aktualisierte Anwendung im Briefcase-Entwicklermodus aus, um zu prüfen, ob unsere Änderung funktioniert.
(beeware-venv) $ briefcase dev
Traceback (letzter Aufruf zuletzt):
Datei „.../venv/bin/briefcase“, Zeile 5, in <module>
from briefcase.__main__ import main
Datei „.../venv/lib/python3.13/site-packages/briefcase/__main__.py“, Zeile 3, in <Modul>
from .cmdline import parse_cmdline
Datei „.../venv/lib/python3.13/site-packages/briefcase/cmdline.py“, Zeile 6, in <Modul>
from briefcase.commands import DevCommand, NewCommand, UpgradeCommand
Datei „.../venv/lib/python3.13/site-packages/briefcase/commands/__init__.py“, Zeile 1, in <Modul>
from .build import BuildCommand # noqa
Datei „.../venv/lib/python3.13/site-packages/briefcase/commands/build.py“, Zeile 5, in <Modul>
from .base import BaseCommand, full_options
Datei „.../venv/lib/python3.13/site-packages/briefcase/commands/base.py“, Zeile 14, in <Modul>
import faker
ModuleNotFoundError: Kein Modul namens „faker“
(beeware-venv) $ briefcase dev
Traceback (letzter Aufruf zuletzt):
Datei „.../venv/bin/briefcase“, Zeile 5, in <module>
from briefcase.__main__ import main
Datei „.../venv/lib/python3.13/site-packages/briefcase/__main__.py“, Zeile 3, in <Modul>
from .cmdline import parse_cmdline
Datei „.../venv/lib/python3.13/site-packages/briefcase/cmdline.py“, Zeile 6, in <Modul>
from briefcase.commands import DevCommand, NewCommand, UpgradeCommand
Datei „.../venv/lib/python3.13/site-packages/briefcase/commands/__init__.py“, Zeile 1, in <Modul>
from .build import BuildCommand # noqa
Datei „.../venv/lib/python3.13/site-packages/briefcase/commands/build.py“, Zeile 5, in <Modul>
from .base import BaseCommand, full_options
Datei „.../venv/lib/python3.13/site-packages/briefcase/commands/base.py“, Zeile 14, in <Modul>
import faker
ModuleNotFoundError: Kein Modul namens „faker“
(beeware-venv) C:\...>briefcase dev
Traceback (letzter Aufruf zuletzt):
Datei „...\venv\bin\briefcase“, Zeile 5, in <Modul>
from briefcase.__main__ import main
Datei „...\venv\lib\python3.13\site-packages\briefcase\__main__.py“, Zeile 3, in <Modul>
from .cmdline import parse_cmdline
Datei „...\venv\lib\python3.13\site-packages\briefcase\cmdline.py“, Zeile 6, in <Modul>
from briefcase.commands import DevCommand, NewCommand, UpgradeCommand
Datei „...\venv\lib\python3.13\site-packages\briefcase\commands\__init__.py“, Zeile 1, in <Modul>
from .build import BuildCommand # noqa
Datei „...\venv\lib\python3.13\site-packages\briefcase\commands\build.py“, Zeile 5, in <Modul>
from .base import BaseCommand, full_options
Datei „...\venv\lib\python3.13\site-packages\briefcase\commands\base.py“, Zeile 14, in <Modul>
import faker
ModuleNotFoundError: Kein Modul namens „faker“
Sie können eine Android-App nicht im Entwicklermodus ausführen – befolgen Sie die Anweisungen für die von Ihnen gewählte Desktop-Plattform.
Sie können eine iOS-App nicht im Entwicklermodus ausführen – befolgen Sie die Anweisungen für die von Ihnen gewählte Desktop-Plattform.
Was ist passiert? Wir haben faker zu unserem Code hinzugefügt, aber nicht
zur virtuellen Umgebung, die zum Ausführen der App im Entwicklungsmodus
verwendet wird.
Wenn Briefcase eine App im Entwicklungsmodus ausführt, erstellt es eine
eigenständige virtuelle Umgebung für diese Anwendung, unabhängig von der
Umgebung, in der Sie briefcase ausführen. Wenn Ihre App nicht angibt, dass sie
eine bestimmte Bibliothek benötigt, wird diese Bibliothek nicht in der
virtuellen Entwicklungsumgebung installiert.
Wie fügen Sie Ihrer Anwendung eine neue Anforderung hinzu?
Aktualisieren von Abhängigkeiten¶
Im Hauptverzeichnis Ihrer Anwendung befindet sich eine Datei namens
pyproject.toml. Diese Datei enthält alle Konfigurationsdetails der Anwendung,
die Sie beim Ausführen von briefcase new angegeben haben.
pyproject.toml ist in Abschnitte unterteilt; einer der Abschnitte beschreibt
die Einstellungen für Ihre Anwendung:
[tool.briefcase.app.helloworld]
formal_name = "Hello World"
description = "Eine Tutorial-App"
long_description = """Weitere Details zur App sollten hier stehen.
"""
sources = ["src/helloworld"]
requires = []
Die Option requires beschreibt die Abhängigkeiten unserer Anwendung. Es
handelt sich um eine Liste von Zeichenfolgen, in der Bibliotheken (und optional
auch Versionen von Bibliotheken) angegeben sind, die Sie in Ihre App aufnehmen
möchten.
Ändern Sie die Einstellung requires so, dass sie lautet:
requires = [
"faker",
]
Durch Hinzufügen dieser Einstellung teilen wir Briefcase mit: "Wenn du meine
Anwendung baust, führe pip install httpx in das Anwendungsbündel ein". Alles,
was eine legale Eingabe für pip install wäre, kann hier verwendet werden - Sie
könnten also angeben:
- Eine bestimmte Bibliotheksversion (z.B.
"httpx==0.19.0"); - Eine Reihe von Bibliotheksversionen (z.B.
"httpx>=0.19"); - Ein Pfad zu einem Git-Repository (z. B.
"git+https://github.com/encode/httpx"); oder - Ein lokaler Dateipfad (Aber Achtung: Wenn Sie Ihren Code an jemand anderen weitergeben, existiert dieser Pfad wahrscheinlich nicht auf dessen Rechner!)
Weiter unten in pyproject.toml werden Sie andere Abschnitte bemerken, die vom
Betriebssystem abhängig sind, wie [tool.briefcase.app.helloworld.macOS] und
[tool.briefcase.app.helloworld.windows]. Diese Abschnitte haben auch eine
requires Einstellung. Diese Einstellungen erlauben es Ihnen, zusätzliche
plattformspezifische Abhängigkeiten zu definieren - wenn Sie also zum Beispiel
eine plattformspezifische Bibliothek benötigen, um einen Aspekt Ihrer Anwendung
zu behandeln, können Sie diese Bibliothek im plattformspezifischen
requires-Abschnitt angeben, und diese Einstellung wird nur für diese Plattform
verwendet. Sie werden feststellen, dass die toga-Bibliotheken alle im
plattformspezifischen requires-Abschnitt angegeben sind - das liegt daran,
dass die Bibliotheken, die für die Anzeige einer Benutzeroberfläche benötigt
werden, plattformspezifisch sind.
In unserem Fall wollen wir, dass httpx auf allen Plattformen installiert wird,
also verwenden wir die Einstellung requires auf Anwendungsebene. Die
Abhängigkeiten auf Anwendungsebene werden immer installiert; die
plattformspezifischen Abhängigkeiten werden zusätzlich zu den Abhängigkeiten
auf Anwendungsebene installiert.
Nachdem Sie die neue Anforderung hinzugefügt haben, speichern Sie
pyproject.toml und führen Sie briefcase dev -r aus. Das Flag -r teilt
Briefcase mit, dass sich die Anforderungen geändert haben und die virtuelle
Entwicklungsumgebung aktualisiert werden muss:
(beeware-venv) $ briefcase dev -r
[helloworld] Dev-Umgebung wird aktiviert...
...
Virtuelle Umgebung (dev.cpython-313-darwin) wird neu erstellt... fertig
[hello-world] Anforderungen werden installiert...
...
[helloworld] Start im Dev-Modus...
===========================================================================
Wenn Sie einen Namen eingeben und auf die Schaltfläche klicken, sollte ein Dialogfeld angezeigt werden, das in etwa wie folgt aussieht:

(beeware-venv) $ briefcase dev -r
[helloworld] Entwicklungsumgebung wird aktiviert...
...
Virtuelle Umgebung neu erstellen (dev.cpython-313-x86_64-linux-gnu)... fertig
[hello-world] Anforderungen installieren...
...
[helloworld] Im Dev-Modus starten...
===========================================================================
Wenn Sie einen Namen eingeben und auf die Schaltfläche klicken, sollte ein Dialogfeld angezeigt werden, das in etwa wie folgt aussieht:

(beeware-venv) C:\...>briefcase dev -r
[helloworld] Entwicklungsumgebung wird aktiviert...
...
Virtuelle Umgebung neu erstellen (dev.cp313-win_amd64)... fertig
[hello-world] Anforderungen installieren...
...
[helloworld] Im Dev-Modus starten...
===========================================================================
Wenn Sie einen Namen eingeben und auf die Schaltfläche klicken, sollte ein Dialogfeld angezeigt werden, das in etwa wie folgt aussieht:

Sie können eine Android-App nicht im Entwicklermodus ausführen – befolgen Sie die Anweisungen für die von Ihnen gewählte Desktop-Plattform.
Sie können eine iOS-App nicht im Entwicklermodus ausführen – befolgen Sie die Anweisungen für die von Ihnen gewählte Desktop-Plattform.
Mögliche Fehler beim Ausführen von „briefcase dev“
Wenn beim Ausführen von briefcase dev weiterhin eine Fehlermeldung angezeigt
wird, stellen Sie Folgendes sicher:
- Sie haben
fakerzur Listerequiresinpyproject.tomlhinzugefügt. - Sie haben Ihre Änderungen in
pyproject.tomlgespeichert und - Sie haben das Argument
-rbeim Ausführen vonbriefcase dev -rangegeben.
Wenn Sie Ihre App zum ersten Mal mit briefcase dev ausführen, wird das
Argument -r automatisch hinzugefügt – deshalb mussten wir das Argument -r
bisher nicht verwenden. Das Argument -r wird nur benötigt, wenn Sie eine
Anforderung hinzufügen, entfernen oder ändern, nachdem Sie Ihre Anwendung im
Entwicklungsmodus ausgeführt haben. Wenn Sie nur den Code aktualisiert haben,
können Sie briefcase dev wie bisher in diesem Tutorial ausführen.
Ausführen der aktualisierten Anwendung¶
Wir haben jetzt eine funktionierende App, die eine Bibliothek eines Drittanbieters verwendet und im Entwicklungsmodus läuft. Packen wir diesen aktualisierten Anwendungscode als eigenständige App. Da wir Codeänderungen vorgenommen haben, müssen wir die gleichen Schritte wie in Tutorial 4 befolgen:
Aktualisieren Sie den Code in der gepackten Anwendung:
(beeware-venv) $ briefcase update
[helloworld] Anwendungscode wird aktualisiert...
...
[helloworld] Anwendung aktualisiert.
Bauen Sie die Anwendung neu auf:
(beeware-venv) $ briefcase build
[helloworld] Ad-hoc-Signierungs-App...
[helloworld] Erstellt: build/helloworld/macos/app/Hello World.app
Und schließlich führen Sie die Anwendung aus:
(beeware-venv) $ briefcase run
[helloworld] App wird gestartet...
===========================================================================
Wenn die Anwendung jedoch ausgeführt wird, wird in der Konsole ein Fehler und ein Absturzdialog angezeigt:

Aktualisieren Sie den Code in der gepackten Anwendung:
(beeware-venv) $ briefcase update
[helloworld] Anwendungscode wird aktualisiert...
...
[helloworld] Anwendung aktualisiert.
Bauen Sie die Anwendung neu auf:
(beeware-venv) $ briefcase build
[helloworld] Anwendungskonfiguration wird fertiggestellt...
...
[helloworld] Anwendung wird erstellt...
...
[helloworld] Erstellt: build/helloworld/linux/ubuntu/jammy/helloworld-0.0.1/usr/bin/helloworld
Und schließlich führen Sie die Anwendung aus:
(beeware-venv) $ briefcase run
[helloworld] App wird gestartet...
===========================================================================
Wenn die Anwendung jedoch ausgeführt wird, wird in der Konsole ein Fehler angezeigt:
Traceback (letzter Aufruf zuletzt):
Datei „/usr/lib/python3.13/runpy.py“, Zeile 194, in _run_module_as_main
return _run_code(code, main_globals, None,
Datei „/usr/lib/python3.13/runpy.py“, Zeile 87, in _run_code
exec(code, run_globals)
Datei „/home/brutus/beeware-tutorial/helloworld/build/linux/ubuntu/jammy/helloworld-0.0.1/usr/app/hello_world/__main__.py“, Zeile 1, in <module>
from helloworld.app import main
Datei „/home/brutus/beeware-tutorial/helloworld/build/linux/ubuntu/jammy/helloworld-0.0.1/usr/app/hello_world/app.py“, Zeile 8, in <module>
import faker
ModuleNotFoundError: Kein Modul namens 'faker'
App helloworld kann nicht gestartet werden.
Aktualisieren Sie den Code in der gepackten Anwendung:
(beeware-venv) C:\...>briefcase update
[helloworld] Anwendungscode wird aktualisiert...
...
[helloworld] Anwendung aktualisiert.
Bauen Sie die Anwendung neu auf:
(beeware-venv) C:\...>briefcase build
...
[helloworld] Erstellt: build\helloworld\windows\app\src\Toga Test.exe
Und schließlich führen Sie die Anwendung aus:
(beeware-venv) C:\...>briefcase run
[helloworld] App wird gestartet...
===========================================================================
Wenn die Anwendung jedoch ausgeführt wird, wird in der Konsole ein Fehler und ein Absturzdialog angezeigt:

Aktualisieren Sie den Code in der gepackten Anwendung:
(beeware-venv) $ briefcase update android
[helloworld] Anwendungscode wird aktualisiert...
...
[helloworld] Anwendung aktualisiert.
Bauen Sie die Anwendung neu auf:
(beeware-venv) $ briefcase build android
[helloworld] App-Metadaten werden aktualisiert...
...
[helloworld] Erstellt: build/helloworld/android/gradle/app/build/outputs/apk/debug/app-debug.apk
Und schließlich starten Sie die App (wählen Sie einen Simulator aus, wenn Sie dazu aufgefordert werden):
(beeware-venv) $ briefcase run android
[helloworld] Nachfolgend die Protokollausgabe des Geräts (drücke STRG+C, um das Protokoll zu beenden)...
===========================================================================
Wenn die Anwendung jedoch ausgeführt wird, wird in der Konsole ein Fehler angezeigt:
--------- Beginn des Absturzes
E/AndroidRuntime: FATAL EXCEPTION: main
E/AndroidRuntime: Prozess: com.example.helloworld, PID: 8289
E/AndroidRuntime: java.lang.RuntimeException: Aktivität ComponentInfo{com.example.helloworld/org.beeware.android.MainActivity} kann nicht gestartet werden: com.chaquo.python.PyException: ModuleNotFoundError: Kein Modul namens 'faker'
E/AndroidRuntime: bei android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3635)
E/AndroidRuntime: bei android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792)
E/AndroidRuntime: bei android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
E/AndroidRuntime: bei android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
E/AndroidRuntime: bei android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
E/AndroidRuntime: bei android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210)
E/AndroidRuntime: bei android.os.Handler.dispatchMessage(Handler.java:106)
E/AndroidRuntime: bei android.os.Looper.loopOnce(Looper.java:201)
E/AndroidRuntime: bei android.os.Looper.loop(Looper.java:288)
E/AndroidRuntime: bei android.app.ActivityThread.main(ActivityThread.java:7839)
E/AndroidRuntime: bei java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime: bei com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
E/AndroidRuntime: bei com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
E/AndroidRuntime: Verursacht durch: com.chaquo.python.PyException: ModuleNotFoundError: Kein Modul namens 'faker'
E/AndroidRuntime: bei <python>.helloworld.app.<module>(app.py:8)
E/AndroidRuntime: bei <python>.java.chaquopy.import_override(import.pxi:60)
E/AndroidRuntime: bei <python>.__main__.<module>(__main__.py:1)
E/AndroidRuntime: bei <python>.runpy._run_code(<frozen runpy>:88)
E/AndroidRuntime: bei <python>.runpy._run_module_code(<frozen runpy>:98)
E/AndroidRuntime: bei <python>.runpy.run_module(<frozen runpy>:226)
E/AndroidRuntime: bei <python>.chaquopy_java.call(chaquopy_java.pyx:352)
E/AndroidRuntime: bei <python>.chaquopy_java.Java_com_chaquo_python_PyObject_callAttrThrowsNative(chaquopy_java.pyx:324)
E/AndroidRuntime: bei com.chaquo.python.PyObject.callAttrThrowsNative(Native Method)
E/AndroidRuntime: bei com.chaquo.python.PyObject.callAttrThrows(PyObject.java:232)
E/AndroidRuntime: bei com.chaquo.python.PyObject.callAttr(PyObject.java:221)
E/AndroidRuntime: bei org.beeware.android.MainActivity.onCreate(MainActivity.java:85)
E/AndroidRuntime: bei android.app.Activity.performCreate(Activity.java:8051)
E/AndroidRuntime: bei android.app.Activity.performCreate(Activity.java:8031)
E/AndroidRuntime: bei android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
E/AndroidRuntime: bei android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3608)
E/AndroidRuntime: ... 12 weitere
I/Process : Signal senden. PID: 8289 SIG: 9
Aktualisieren Sie den Code in der gepackten Anwendung:
(beeware-venv) $ briefcase update iOS
[helloworld] Anwendungscode wird aktualisiert...
...
[helloworld] Anwendung aktualisiert.
Bauen Sie die Anwendung neu auf:
(beeware-venv) $ briefcase build iOS
[helloworld] App-Metadaten werden aktualisiert...
...
[helloworld] Erstellt: build/helloworld/ios/xcode/build/Debug-iphonesimulator/Hello World.app
Und schließlich starten Sie die App (wählen Sie einen Simulator aus, wenn Sie dazu aufgefordert werden):
(beeware-venv) $ briefcase run iOS
...
[helloworld] Nachfolgend die Log-Ausgabe des Simulators (drücke STRG+C, um das Protokoll zu beenden)...
===========================================================================
Wenn die Anwendung jedoch ausgeführt wird, wird in der Konsole ein Fehler angezeigt:
Die Anwendung ist abgestürzt!
========================
Traceback (letzter Aufruf zuletzt):
Datei „/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", Zeile 1, in <Modul>
from helloworld.app import main
Datei „/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", Zeile 8, in <Modul>
import faker
ModuleNotFoundError: Kein Modul namens 'faker'
Wieder einmal konnte die App nicht gestartet werden, weil faker nicht
installiert wurde - aber warum? Haben wir faker nicht schon installiert?
Wir haben es – aber nur in der Entwicklungsumgebung. Jede erstellte Anwendung
verfügt auch über eine eigene eigenständige Umgebung, die Briefcase erstellt,
wenn Sie briefcase build ausführen. Als wir briefcase dev -r ausgeführt
haben, haben wir faker zu unserer Entwicklungsumgebung hinzugefügt, aber
nicht zur gepackten App. Wir müssen auch briefcase update -r ausführen, damit
Briefcase weiß, dass sich die Anforderungen der gepackten App geändert haben:
(beeware-venv) $ briefcase update -r
[helloworld] Anwendungscode wird aktualisiert...
Installation von src/hello_world...
[helloworld] Anforderungen werden aktualisiert...
Faker wird gesammelt
Verwendung des zwischengespeicherten faker-37.3.0-py3-none-any.whl.metadata (15 kB)
...
Installation der gesammelten Pakete: tzdata, travertino, std-nslog, rubicon-objc, fonttools, toga-core, faker, toga-cocoa
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 und tzdata-2025.2 erfolgreich installiert
[helloworld] Entfernen nicht benötigter App-Inhalte...
...
[helloworld] Anwendung aktualisiert.
(beeware-venv) $ briefcase update -r
[helloworld] Anwendungskonfiguration wird abgeschlossen...
Ziel: ubuntu:jammy (Vendor-Basis Debian)
Glibc-Version ermitteln... fertig
Ziel: glibc 2.35
Ziel: Python 3.13
[helloworld] Anwendungscode aktualisieren...
Installation von src/hello_world...
[helloworld] Anforderungen aktualisieren...
Faker wird gesammelt
Verwendung des zwischengespeicherten faker-37.3.0-py3-none-any.whl.metadata (15 kB)
...
Installation der gesammelten Pakete: tzdata, travertino, std-nslog, rubicon-objc, fonttools, toga-core, faker, toga-cocoa
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 und tzdata-2025.2 erfolgreich installiert
[helloworld] Entfernen nicht benötigter App-Inhalte...
...
[helloworld] Anwendung aktualisiert.
(beeware-venv) C:\...>briefcase update -r
[helloworld] Anwendungscode wird aktualisiert...
Installation von src/helloworld...
[helloworld] Anforderungen werden aktualisiert...
Faker wird gesammelt
Verwendung des zwischengespeicherten faker-37.3.0-py3-none-any.whl.metadata (15 kB)
...
Installation der gesammelten Pakete: tzdata, travertino, std-nslog, rubicon-objc, fonttools, toga-core, faker, toga-cocoa
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 und tzdata-2025.2 erfolgreich installiert
[helloworld] Entfernen nicht benötigter App-Inhalte...
...
[helloworld] Anwendung aktualisiert.
(beeware-venv) $ briefcase update android -r
[helloworld] Anwendungscode wird aktualisiert...
src/helloworld wird installiert... fertig
[helloworld] Anforderungen werden aktualisiert...
Anforderungsdatei wird geschrieben... fertig
[helloworld] Nicht benötigte App-Inhalte werden entfernt...
Nicht benötigte App-Bundle-Inhalte werden entfernt... fertig
[helloworld] Anwendung aktualisiert.
(beeware-venv) $ briefcase update iOS -r
[helloworld] Anwendungscode wird aktualisiert...
Installation von src/helloworld... fertig
[helloworld] Anforderungen werden aktualisiert...
Indizes werden durchsucht: https://pypi.org/simple, https://pypi.anaconda.org/beeware/simple
Faker wird gesammelt
Verwendung des zwischengespeicherten faker-37.4.0-py3-none-any.whl.metadata (15 kB)
...
App-Anforderungen für den iPhone-Simulator werden installiert... fertig
[helloworld] Nicht benötigte App-Inhalte werden entfernt...
Nicht benötigte App-Bundle-Inhalte werden entfernt... fertig
[helloworld] Anwendung aktualisiert.
Sobald Sie das Update durchgeführt haben, können Sie briefcase build und
briefcase run ausführen - und Sie sollten Ihre gepackte Anwendung mit dem
neuen Dialogverhalten sehen.
Hinweis
Die Option -r zum Aktualisieren der Anforderungen wird auch von den Befehlen
build und run beachtet. Wenn Sie also in einem Schritt aktualisieren, bauen
und ausführen wollen, können Sie briefcase run -u -r verwenden.
Python-Pakete von Drittanbietern für Mobilgeräte und das Web¶
Faker ist nur ein Beispiel für ein Python-Paket eines Drittanbieters – eine
Sammlung von Code, der nicht Teil der Standardausstattung von Python ist. Diese
Pakete von Drittanbietern werden meist über den Python Package Index
(PyPI) verteilt und in Ihrer lokalen virtuellen Umgebung
installiert. In diesem Tutorial haben wir pip verwendet, aber es gibt auch
andere Optionen.
Auf Desktop-Plattformen (macOS, Windows, Linux) kann im Wesentlichen jedes Paket auf PyPI in Ihrer virtuellen Umgebung installiert oder zu den Anforderungen Ihrer App hinzugefügt werden. Beim Erstellen einer App für mobile oder Web-Plattformen sind Ihre Optionen jedoch etwas eingeschränkt.
Kurz gesagt: Jedes reine Python-Paket (d. h. jedes Paket, das aus einem ausschließlich in Python geschriebenen Projekt erstellt wurde) kann ohne Probleme verwendet werden. Einige Pakete werden jedoch aus Projekten erstellt, die sowohl Python als auch andere Sprachen (z. B. C, C++, Rust usw.) enthalten. Code, der in diesen Sprachen geschrieben wurde, muss vor der Verwendung zu plattformspezifischen Binärmodulen kompiliert werden, und diese vorkompilierten Binärmodule sind nur auf bestimmten Plattformen verfügbar. Mobile und Web-Plattformen haben ganz andere Anforderungen als „Standard“-Desktop-Plattformen. Derzeit bieten die meisten Python-Pakete keine vorkompilierten Binärdateien für mobile und Web-Plattformen an.
Auf PyPI werden Pakete oft in einem vorgefertigten Distributionsformat namens
wheels bereitgestellt. Um zu überprüfen, ob ein Paket reines Python ist,
schauen Sie auf der PyPI-Downloadseite für das Projekt nach. Wenn die
bereitgestellten Wheels die Endung -py3-none-any.whl haben (z. B.
Faker), dann handelt es sich um
reine Python-Wheels. Wenn die Wheels jedoch versions- und plattformspezifische
Erweiterungen haben (z. B.
Pillow, das Wheels mit Suffixen
wie -cp313-cp313-macosx_11_0_arm64.whl und -cp39-cp39-win_amd64.whl hat),
dann enthält das Wheel eine binäre Komponente. Dieses Paket kann nicht auf
mobilen oder Web-Plattformen installiert werden, es sei denn, es wurde ein mit
diesen Plattformen kompatibles Wheel bereitgestellt.
Derzeit bieten die meisten Binärpakete auf PyPI keine mobil- oder webfähigen
Wheels an. Um diese Lücke zu schließen, stellt BeeWare Binärdateien für einige
beliebte Binärmodule (einschließlich numpy, pandas und cryptography) zur
Verfügung. Diese Wheels werden nicht auf PyPI verteilt, aber Briefcase
installiert sie, sofern sie verfügbar sind.
BeeWare kann Binärdateien für einige beliebte Binärmodule (einschließlich
numpy, pandas und cryptography) bereitstellen. Es ist normalerweise
möglich, Pakete für mobile Plattformen zu kompilieren, aber es ist nicht einfach
einzurichten - das würde den Rahmen eines einführenden Tutorials wie diesem
sprengen.
Nächste Schritte¶
Wir haben jetzt eine App, die eine Bibliothek eines Drittanbieters verwendet! In Tutorial 8 lernen wir, wie wir sicherstellen können, dass unsere App auch dann reaktionsschnell bleibt, wenn wir komplexere Anwendungslogik hinzufügen.