Fehlermeldung bei der Erstellung von GUI

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    also ich habe mal nun einen anderen Weg versucht die GUI zu programmieren.

    Ich nutze nun die Library Kivy und Picamera aber irgendwie läuft es nicht wie ich es mir vorgestellt habe. Ich lade mal mein Code und die Fehlermeldung hoch.

    Wo liegt mein Fehler? Kann es sein, dass es Problem gibt mit der Library und dem Raspberry Pi 3?

    VG

    Anton

  • Da steht doch der nächste Schritt als Handlungsanweisung drin: das ganze mal mit ``-d`` als Argument starten um mehr Debug-Informationen ausgegeben zu bekommen.

    Interessant wäre wahrscheinlich auch noch wie `kivy` installiert wurde. Wenn da was kompiliert wurde und `kivy.lib.vidcore_lite.bcm` nicht importiert werden kann, dann fehlten da vielleicht/wahrscheinlich die Voraussetzungen für. Was kein harter Fehler ist, weil es ja Alternativen gibt, aber auf einem Raspi ist das wahrscheinlich schon die beste Wahl auf EGL mit Hardwareunterstützung zu setzen. X11-Unterstützung scheint auch nicht da zu sein. Der Fallback wäre dann `libsdl2` und da fehlt dann das `sdl2`-Modul.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Hallo,

    in der Kivy-Dokumentation gibt es extra einen Abschnitt für die Installation auf dem Pi. Damit läuft Kivy, zumindest lief es auf einer Desktop-Version von Buster bei mir.

    Bin gerade am Handy, deswegen musst du die Doku mal selbst durchsuchen.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Anton Der Code funktioniert hinten und vorne nicht. Methoden sind falsch eingerückt. `image_camera` auf Modulebene macht keinen Sinn, dafür wird im Code dann versucht auf ein nicht-existierendes Attribut mit dem Namen zuzugreifen.

    Klassennamen werden in PascalCase geschrieben, also nicht `camera_Raspi` sondern `CameraRaspi`. Wobei der Name inhaltlich nicht gut ist.

    `PiCamera` und `PiRGBArray` sind Kontextmanager, die sollte man mit ``with`` benutzen. Der Code an der Stelle ist aber auch reichlich komisch, denn da ist eine Schleife wo die Schleifenvariable `frame` überhaupt nicht verwendet wird.

    `update_kivy()` ist als Name falsch, denn Kivy wird da gar nicht aktualisiert. Die Kommunikation über ein Attribut ist auch nicht wirklich schön/sauber. Man kann die Daten da auch als Argument weiterreichen und sich den Zustand der ja nicht wirklich welcher ist, einzufangen. In `update_texture()` ist da ja sogar schon ein Argument für vorgesehen, was dann aber gar nicht verwendet wird.

    `use_video_video_port` ist offensichtlich falsch geschrieben — da ist ein `video` zu viel.

    Der Thread für die Kameraverarbeitung wird nirgends gestartet.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Hallo,

    herzlichen Dank für eure Hilfestellung. Ich werde versuchen alle Kommentare nachzuvollziehen und werde es bearbeiten.

    Ich habe mal mein Code etwas reduziert und versucht mal kivy wegzulassen und erstmal nur die Cam einschalten. Aber auch hier habe ich eine Fehlermeldung. Kann das aber nicht nachvollziehen.

    Code:

    (das Einrücken wird hier nicht dargestellt)

    Fehlermeldung:

    Traceback (most recent call last):

    File "/home/pi/GUI/Code/Kivy/cam_Raspi.py", line 12, in <module>

    for frame in camera.capture_continuous(rawcapture, format="bgr", use_video_port=True):

    File "/usr/lib/python3/dist-packages/picamera/camera.py", line 1702, in capture_continuous

    if not encoder.wait(self.CAPTURE_TIMEOUT):

    File "/usr/lib/python3/dist-packages/picamera/encoders.py", line 395, in wait

    self.stop()

    File "/usr/lib/python3/dist-packages/picamera/encoders.py", line 419, in stop

    self._close_output()

    File "/usr/lib/python3/dist-packages/picamera/encoders.py", line 349, in _close_output

    mo.close_stream(output, opened)

    File "/usr/lib/python3/dist-packages/picamera/mmalobj.py", line 371, in close_stream

    stream.flush()

    File "/usr/lib/python3/dist-packages/picamera/array.py", line 238, in flush

    self.array = bytes_to_rgb(self.getvalue(), self.size or self.camera.resolution)

    File "/usr/lib/python3/dist-packages/picamera/array.py", line 126, in bytes_to_rgb

    raise PiCameraValueError(

    picamera.exc.PiCameraValueError: Incorrect buffer length for resolution 1280x720

  • Naja, offenbar passen die Grösse des Bildes von der Kamera nicht zur Grösse des `PiRGBArray`-Objekts. Also entweder musst Du die auch bei der Kamera angeben, und zwar so, dass sie zum Array passt, oder Du darfst sie beim Array halt auch *nicht* angeben, damit dort automatisch die Grösse genommen wird, die von der Kamera kommt.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Hallo,

    erstmal wollte ich den Link zur Installation von Kivy nachreichen:

    https://kivy.org/doc/stable-1.1…lation-rpi.html

    Dann würde ich dir an Stelle empfehlen bei 'tkinter' zu bleiben. Ich finde 'kivy' ist doch etwas anspruchsvoller und tkinter ist für den Einstieg besser geeignt.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Guten Abend, danke für eure Hilfe.

    Ja, es stimmt mit "kivy" ist es etwas komplizierter aber in "tkinter" finde ich viele Befehle nicht. Wenn ich z.B. die Aufnahme stoppen möchte, dann passiert dies erst nachdem die Aufnahme abgelaufen ist. Ich glaube schon das "tkinter" einfach wäre, was das Verständnis angeht aber in "kivy" gibt es viele Funktionen die vordefiniert.

  • Hallo,

    'tkinter' und 'kivy' sind nur für die Darstellung zuständig. Also die grafische Aufbereitung deines Programms. Die Aufnahme starten und stoppen sind davon unabhängig und sollte ein Programmteil für sich sein.

    Schau mal dass du die Bedienung der Kamera ohne das grafische Zeugs hinbekommst. Erst wenn das steht baut man dann Button's und Co. drum rum. Ob die dann von 'tkinter', 'kivy', 'Qt' oder was auch immer kommen, sollte keine Rolle spielen.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Alles klar, ich werde es mal weiter mit Tkinter versuchen. Kivy ist wirklich etwas komplizierter.

    Herzlichen Dank für eure Hilfestellungen. Finde das wirklich super, wie man hier mit Fragen umgeht und versucht einem auch wirklich zu helfen.

    Hab schon einiges lernen können mit euren Tipps.

    Viele Grüße

    Anton

  • Guten Abend,

    also ich bin jetzt soweit, dass ich meine Cam einschalten kann mit "Play_Button" und Aufnahme mit "Pause_Button". Womit ich Schwierigkeiten habe, ist mein Stopp_Button. Das Programm soll die Aufnahme und die Vorschau schließen aber die GUI soll trotzdem sichtbar sein. Könnte mir da vielleicht jemand helfen. Hab überhaupt ein Ansatz mehr bzw. weiß nicht wie ich da ran gehen soll. Ich stell mal mein Code hier wieder rein, was ich bis jetzt.

  • Anton Also erst einmal müsste man da aufräumen. Es wird eine ganze Menge importiert was überhaupt nicht verwendet wird: `datetime`, `Path`, `sleep()`, `filedialog`, `pygame`, und gaaaaanz viele Namen die durch den *-Import aus `tkinter` kommen werden momentan überhaupt nicht verwendet.

    `run()` aus `subprocess` wird auch nicht verwendet. Das wird zwar an mehreren Stellen aufgerufen, aber komplett sinnfrei mit einem total unsinnigen Argument. Das Anhalten der Vorschau funktioniert deshalb auch nicht, weil die `run()`-Zeile davor schon eine Ausnahme auslöst.

    `Path` könnte man vielleicht sinnvoll verwenden wenn man weniger Pfadteile redundant im Quelltext stehen haben will.

    Alle Kommentare bis auf den beim VIDEO_PATH enthalten keinerlei Mehrwert über den Code weil da nur das noch mal steht was wirklich sehr offensichtlich da ja schon als Code steht.

    Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

    Wodurch `camera` dann auch nicht mehr einfach so auf magische Weise in irgendwelchen Funktionen verwendet werden kann, ohne dass es als Argument übergeben wird. Dafür macht das `master`-Argument bei den Funktionen keinen Sinn, denn keine der Funktionen verwendet das für irgend etwas.

    `preview()` braucht man nicht wirklich weil man da auch gleich die entsprechende Methode vom `camera`-Objekt als `command` angeben kann. Und auch `record()` kann man sich sparen.

    Die Ressource `PiCamera` wird bei Programmende nicht ordentlich abgeräumt. Das Objekt ist netterweise ein Kontextmanager und kann mit ``with`` verwendet werden.

    Ungetestet:

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Ufffff, das einige Bibliotheken weg mussten, das war mir klar. Aaaaaber das ich nichts richtig gemacht habe, das ist erschreckend für mich. Aber trotzdem bin ich Dir sehr dankbar. Ich werde mir mal dein Code angucken und versuchen es zu verstehen.

  • Hallo,

    naja 'BoxLayout' ist jetzt nicht speziell für Kameras gemacht, sondern man kann in der Box verschiedene Objekte anordnen.

    Mit 'tkinter' kannst du deine Vorschau in ein Label setzen und mit ImageTk von Pillow kannst du ein Objekt erstellen, dass Bild für Bild ausgibt.

    Dazu gibt es viele Beispiele im Netz. Bitte beachte das du dabei 100% auf *-Importe stößt. Gewönne dir das nicht an und importiere nur was du brauchst.

    Du kannst auch gerne dein Code zeigen und wir kommen gemeinsam ans Ziel.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Hallo,

    ok, ich zeige mal mein Code.

    Mein Ziel ist es jetzt, dass die Vorschau bzw. die Aufnahme in einer Box zu sehen ist und unter dieser Box meine Buttons platziert werden.

    Außerdem soll die Textausgabe der einzelnen Button angezeigt werden, aber oberhalb der Button, also zwischen der Box und Button.

    Vielen Dank für eure Hilfe.

    Grüße

    Anton

  • Anton: `ButtonBox` wird importiert aber nirgends verwendet.

    `my_` ist in 99,99% der Fälle ein komplett überflüssiger Präfix, weil der keinen Informationsgehalt hat wenn es nicht auch etwas wie `our_` oder `their_` als Präfix für den gleichen Namen gibt, wogegen sich das abgrenzen würde.

    Die Label werden an der falschen Stelle erstellt. So wie es jetzt ist wird bei jedem Button-Klick ein neues Label erstellt und der GUI hinzugefügt. Das ist ja sicher nicht gewollt. Man erstellt üblicherweise einmal am Anfang alle GUI-Elemente und verändert die dann im laufe des Programms.

    Bei den Labels wird nicht explizit gesagt in welches Elternwidget die eingefügt werden sollen. Dann wird (leider) automagisch das Hauptfenster genommen, was ja aber nicht zwingen gewünscht ist und Veränderungen an der GUI unnötig erschwert. Man sollte deshalb immer explizit das Elternwidget übergeben.

    Die Aktionsrückrufe müssen neben der Kamera dann auch das Label-Objekt als Argument bekommen, damit sie den angezeigten Text verändern können.

    Wenn das `tkinter`-Modul eine passende Konstante bereitstellt, sollte man die verwenden, statt den Wert selbst noch mal literal in den Quelltext zu schreiben.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Vielen Dank, für deine Hilfe. Es funktioniert wunderbar. Die GUI läuft auf einem Touche-Display und wenn ich die GUI starten, dann kann ich die Button bzw. die GUI nicht bedienen, weil das Bild komplett über das Display anzeigt wird.

    Was kann ich da tun, wenn ich Tkinter verwende möchte?

    Grüße

    Anton

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!