MJPG Stream via TkInter Button Beenden

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,
    Ich habe mir für meine Live-Camera ein kleines TkInter GUI gebaut. Über dieses GUI möchte ich via Button den Stream Starten und auch Beenden können.
    Kann mir evtl. jemand sagen wie ich das bei diesem Script umsetzen kann?

    Egal was ich tue oder wie ich camera.stop_recording() Aufrufe der Stream läuft weiter und die App/GUI hängt sich auf.

    Es geht um folgenden Streaming Code:

    Das Script bzw. den Stream kann ich nur Beenden wenn ich ihn mit strg+c "kille" was aber mit einer GUI nicht so optimal ist.

  • StolleJay Da fehlen die Importe und man muss ja echt mit der Lupe suchen wo da was mit Tk gemacht wird, wo doch die Frage eigentlich um die Tk-GUI geht. Am sichersten wäre ich mir da bei der END-Konstanten, die hoffentlich nicht durch einen *-Import in das Modul kam, denn die bringt so cirka 140 Freunde mit. Und die Verwendung bei console.insert() an zwei Stellen. Keine Definition von console und auch sonst nichts was auf tkinter hindeutet. Insbesondere steht da nirgends der Aufruf der mainloop() ohne die eine GUI nicht auf Ereignisse reagieren kann.

    camera.stop_recording() kann so nie aufgerufen werden. Denn der serve_forever()-Aufruf kann ja nur durch eine Ausnahme durch Fehler oder Strg+C abgebrochen werden. Und dann wird der stop_recording()-Aufruf nicht erreicht.

    PAGE, resW, resH, fps, logfile(), timestamp, console und port sind nicht definiert.

    Bei logfile() und timestamp ist auch komisch dass das neben dem logging-Modul benutzt wird, was ja auch vorkommt. Wenn man das verwendet, muss man sich Zeitstempel und Logfunktionen ja nicht noch mal selbst basteln‽

    Der Code am Ende sollte auch nicht auf Modulebene stehen und einfach loslaufen wenn man das Modul nur importiert. Das Hauptprogramm steht üblicherweise in einer Funktion die main() heisst.

    Von object muss man nicht explizit erben.

    Zeichenketten und Werte mit + und str() zusammensetzen ist eher BASIC als Python. In Python gibt es dafür die format()-Methode und f-Zeichenkettenliterale. Man erstellt auch nicht zweimal direkt hintereinander die inhaltlich (fast) gleiche Zeichenkette.

    Der StreamingServer ist fast überflüssig. Die Klasse macht nichts anderes als http.server.ThreadingHTTPServer. Allerdings braucht man ja irgendwie eine Möglichkeit output an den Server zu übergeben, damit der da ran kommt wenn das nicht mehr einfach so unsauber global definiert ist.

    getCPUtemperature() ist eine Funktion die tief in einer Methode, in einem bedingten Zweig, in einer Schleife immer und immer wieder neu und gleich definiert wird. Das macht so gar keinen Sinn. Externe Programme startet man mit dem subprocess-Modul. os.popen() wird hier auch unsauber verwendet, weil gar keine Möglichkeit besteht bei dem Code, das Dateiobjekt auch wieder sauber zu schliessen. Und replace() ist nicht wirklich die richtige Methode um auszudrücken das etwas am Anfang oder Ende einer Zeichenkette entfernt werden soll.

    Das Wissen um das Condition-Objekt sollte nicht so weit verteilt sein. Wenn man StreamingOutput eine get_frame()-Methode verpasst, kann das innerhalb dieser Klasse bleiben. Und so wie das benutzt wird, macht es Sinn das Objekt iterierbar über Frames zu machen. Damit spart man sich schon mal eine Einrückebene in der do_GET()-Methode.

    In einem fremden Modul von aussen einfach so Konstanten definieren ist, äh, mutig. Und unsinnig weil es cv2.IMREAD_COLOR gibt. Ich sehe auch nicht wirklich den Sinn hier OpenCV mit ins Boot zu holen. PIL/Pillow kann JPEG-Bilder dekodieren. Man muss auch nicht jedes kleine Zwischenergebnis an einen (schlechten) Namen binden.

    bg_h ist nicht nur ein schlechter Name, sondern wird auch gar nicht verwendet.

    traceback.print_exc() macht keinen Sinn wenn man direkt danach einen logging.warning()-Aufruf hat. Webei die allgemeine Exception hier auch, nun ja, zu allgemein ist, denn man erwartet ja eigentlich nur, dass sich der Client hier verabschiedet hat, und deshalb das schreiben auf die Verbindung nicht mehr funktioniert.

    Zwischenstand (ungetestet):

    "He who laughs last thinks slowest"

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!