Kameranutzung

Fast jedes moderne Computergerät verfügt über eine Kamera. In diesem Tutorial schreiben wir eine neue Anwendung, die Zugriff auf diese Kamera anfordern, ein Foto aufnehmen und dieses Foto dann in der App anzeigen kann. Neue Anwendung, die die Kamera Ihres Geräts verwendet.

Dieses Tutorial funktioniert nicht auf allen Plattformen!

Leider funktioniert dieses Tutorial derzeit nur auf macOS und Android.

Obwohl alle iPhones über Kameras verfügen, verfügt der iOS-Simulator nicht über eine funktionierende Kamera. Windows- und Linux-Geräte verfügen ebenfalls über Kameras, aber Toga kann derzeit auf diesen Plattformen nicht auf die Kamera zugreifen.

Der hier dargestellte Code läuft unter Windows oder Linux, löst jedoch einen Fehler aus, wenn Sie versuchen, ein Foto aufzunehmen.

Der Code funktioniert, wenn er auf einem echten iOS-Gerät ausgeführt wird, kann jedoch kein Foto aufnehmen, wenn er im iOS-Simulator bereitgestellt wird.

Neues Projekt starten

Für dieses Tutorial werden wir nicht auf der Anwendung aus dem Kerntutorial aufbauen, sondern ein neues Projekt beginnen. Sie können dieselbe virtuelle Umgebung verwenden, die Sie im ersten Projekt verwendet haben. Wir müssen jedoch den Assistenten „Aktenkoffer neu“ erneut ausführen.

Wechseln Sie zurück in das Verzeichnis, das den Projektordner helloworld enthält, und starten Sie ein neues Projekt mit dem Namen „Hello Camera“:

(beeware-venv) $ cd ..
(beeware-venv) $ briefcase new
...
[hellocamera] Generated new application 'Hello Camera'

To run your application, type:

    $ cd hellocamera
    $ briefcase dev

(beeware-venv) $ cd hellocamera

Fügen Sie Code hinzu, um ein Foto aufzunehmen

Der Assistent hat ein neues leeres Toga-Projekt generiert. Wir können jetzt den Code zum Aufnehmen und Anzeigen eines Fotos hinzufügen. Bearbeiten Sie die Datei app.py für die neue Anwendung, sodass sie den folgenden Inhalt hat:

import toga
from toga.style import Pack
from toga.style.pack import COLUMN, ROW


class HelloCamera(toga.App):
    def startup(self):
        main_box = toga.Box()

        self.photo = toga.ImageView(style=Pack(height=300, padding=5))
        camera_button = toga.Button(
            "Take photo",
            on_press=self.take_photo,
            style=Pack(padding=5)
        )

        main_box.add(self.photo)
        main_box.add(camera_button)

        self.main_window = toga.MainWindow(title=self.formal_name)
        self.main_window.content = main_box
        self.main_window.show()

    async def take_photo(self, widget, **kwargs):
        try:
            if not self.camera.has_permission:
                await self.camera.request_permission()

            image = await self.camera.take_photo()
            if image:
                self.photo.image = image
        except NotImplementedError:
            await self.main_window.dialog(
                toga.InfoDialog(
                    "Oh no!",
                    "The Camera API is not implemented on this platform",
                )
            )
        except PermissionError:
            await self.main_window.dialog(
                toga.InfoDialog(
                    "Oh no!",
                    "You have not granted permission to take photos",
                )
            )


def main():
    return HelloCamera()

Dieser Code weist gegenüber der von Briefcase generierten Standard-App zwei Änderungen auf. Diese Ergänzungen sind gelb hervorgehoben:

  1. Der erste hervorgehobene Codeblock (in der Methode startup()) fügt die beiden Widgets hinzu, die zur Steuerung der Kamera erforderlich sind: ein ImageView zum Anzeigen eines Fotos und einen Button zum Auslösen der Kamera.

  2. Der zweite hervorgehobene Codeblock (die Methode take_photo()) definiert den Ereignishandler, wenn die Schaltfläche gedrückt wird. Dieser Handler bestätigt zunächst, ob die Anwendung die Berechtigung zum Aufnehmen eines Fotos hat. Wenn keine Berechtigung vorliegt, wird sie angefordert. Dann wird ein Foto aufgenommen. Die Anforderung der Berechtigung und die Anforderung zum Aufnehmen eines Fotos sind beide asynchrone Anforderungen, sodass die Verwendung von await erforderlich ist. Während die App darauf wartet, dass der Benutzer die Berechtigung bestätigt oder das Foto aufnimmt, kann die Ereignisschleife der App im Hintergrund fortgesetzt werden.

Wenn die Kamera erfolgreich ein Foto aufnimmt, gibt sie ein „Image“-Objekt zurück, das als Inhalt der ImageView zugewiesen werden kann. Wenn die Fotoanforderung vom Benutzer abgebrochen wurde, gibt der Aufruf self.camera.take_photo() None zurück und das Ergebnis kann ignoriert werden. Wenn der Benutzer keine Berechtigung zur Verwendung der Kamera erteilt oder die Kamera auf der aktuellen Plattform nicht implementiert ist, wird ein Fehler ausgelöst und dem Benutzer ein Dialogfeld angezeigt.

Geräteberechtigungen hinzufügen

Ein Teil des Codes, den wir gerade hinzugefügt haben, fragt nach der Erlaubnis, die Kamera zu verwenden. Dies ist eine gängige Funktion moderner App-Plattformen – Sie können nicht auf Hardwarefunktionen zugreifen, ohne vorher ausdrücklich die Erlaubnis des Benutzers einzuholen.

Diese Anfrage besteht aus zwei Teilen. Der erste Teil befindet sich im Code, den wir gerade gesehen haben. Bevor die App jedoch Berechtigungen anfordern kann, muss sie die Berechtigungen deklarieren, die sie anfordern wird.

Die für jede Plattform erforderlichen Berechtigungen unterscheiden sich geringfügig, aber Briefcase bietet eine plattformübergreifende Darstellung für viele gängige Hardwareberechtigungen. Fügen Sie im Konfigurationsabschnitt [tool.briefcase.app.helloworld] der Datei pyproject.toml Ihrer App Folgendes hinzu (direkt über der Deklaration Sources):

permission.camera = "App will take mugshots."

Dies erklärt, dass Ihre App auf die Kamera zugreifen muss, und liefert eine kurze Beschreibung, warum die Kamera erforderlich ist. Diese Beschreibung ist auf einigen Plattformen erforderlich (insbesondere macOS und iOS) und wird dem Benutzer als zusätzliche Information angezeigt, wenn der Berechtigungsdialog angezeigt wird.

Wir können jetzt die App generieren und ausführen:

(beeware-venv)$ briefcase create
(beeware-venv)$ briefcase build
(beeware-venv)$ briefcase run

Wenn die App ausgeführt wird, wird Ihnen eine Schaltfläche angezeigt. Drücken Sie die Schaltfläche, und der Standardkameradialog der Plattform wird angezeigt. Machen Sie ein Foto. Der Kameradialog verschwindet und das Foto wird in der App direkt über der Schaltfläche angezeigt. Sie können dann ein weiteres Foto machen. Dadurch wird das erste Foto ersetzt.

Weitere Berechtigungen hinzufügen

Berechtigungen werden in den Dateien deklariert, die während des ursprünglichen Aufrufs von briefcase create generiert werden. Leider kann Briefcase diese Dateien nicht aktualisieren, nachdem sie einmal generiert wurden. Wenn Sie Ihrer App also eine neue Berechtigung hinzufügen oder vorhandene Berechtigungen ändern möchten, müssen Sie die App neu erstellen. Sie können dies tun, indem Sie briefcase create erneut ausführen. Dadurch werden Sie gewarnt, dass die vorhandene App überschrieben wird, und die Anwendung wird dann mit den neuen Berechtigungen neu generiert.