GUI für anspruchsvolle Anfänger

  • Hallo Allerseits,

    meine ursprüngliche Aufgabe war ein etwas sehr in die Jahre gekommenes Gerät wieder Labortauglich zu machen. Bei dem Gerät handelt es sich um einen sogenannten Gel-Dokumenter. Dabei werden unter einer Haube Agarose-Gel-Platten auf einen Leuchttisch fotographiert und dokumentiert. Bisher diente dazu eine betagte Digital-Kamera mit der gigantischen Auflösung von 800x600 Pixeln.

    Das einzig wirklich Gute an der Apparatur ist die Haube und die Optik mit einem C-Mount.

    Ich habe die veraltete Kamera gegen eine HQ-Cam und einen RPi4 getauscht. Der Pi übernimmt mit der PiCam auch die Nachbearbeitung, sprich Archivierung, der Aufnahmen.

    Mit Python und PiCamera habe ich ein Preview auf den Bildschirm gegeben und über einen GPIO-Pin die eigentliche Aufnahme ausgelöst. War auf dem Weg auch recht schnell erledigt, aber dann kam jemand aus dem Labor und wünschte sich statt der GPIO-Buttons eine GUI.

    In meiner grenzenlosen Naivität habe ich zugesagt diesen Wunsch zu erfüllen und dazu auch Python zu nutzen. Normalerweise löse ich sowas über eine PHP-getriebene Web-Oberfläche mit CSS und JS. Wie da allerdings die Camera hineingepasst hätte, weiß ich nicht.

    Als GUI Library habe ich mir guizero ausgesucht, das schien am schnellsten für mich als Python-Neuling erlen- und nutzbar zu sein.

    Ob das wirklich so klug war, wage ich jetzt, nach mehreren Tagen frustrierenden Experimentierens, zu bezweifeln.

    Allein das Positionieren der Widgets ist, CSS-verwöhnt wie ich nun mal bin, eine Zumutung.

    Also hier meine wichtigsten Fragen:

    • Gibt's einen Weg Logik und Verarbeitung vom Layout zu trennen?
    • Gibt's eine "bessere" GUI Library für meine Zwecke, die auch in angemessener Zeit erlernbar ist?
    • Momentan lege ich die Vorschau camera.start_preview(...) ganz brutal über einen Bereich des Bildschirms - geht das cleverer?

    Die restlichen Fragen kenne ich noch garnicht. :wallbash:

  • Hallo,

    Gibt's einen Weg Logik und Verarbeitung vom Layout zu trennen?

    Ja, dafür nutzt man Funktionen und eventuell Klassen.


    Gibt's eine "bessere" GUI Library für meine Zwecke, die auch in angemessener Zeit erlernbar ist?

    Damit oder mit 'tkinter' bist du bestimmt bei den einsteigerfreundlichsten. Ich habe aber nicht viel Erfahrung mit anderen Frameworks, von daher kann vielleicht sonst jemand noch mehr dazu sagen. Die zwei mit denen ich sonst noch gearbeitet(Kivy, Qt) habe, finde ich deutlich anspruchsvoller.

    Vielleicht wäre es hilfreich mal zu beschreiben, was dein Programm genau alles können muss/soll und deinen bisherigen Versuch zu posten.

    Dann kann man bestimmt besser sagen, in welche Richtung du dich bewegen sollst.

    Momentan lege ich die Vorschau camera.start_preview(...) ganz brutal über einen Bereich des Bildschirms - geht das cleverer?

    Zeig uns bitte den brutalen Code, hier sind tapfere User anwesend ^^

    Ich weis jetzt nicht in wie weit du mit Python programmieren kannst, aber ich verlinke dir einfach mal das offizielle Python-Tutorial. Es lohnt sich auf jeden Fall dass durchzuarbeiten, bevor man eine GUI erstellt.

    Grüße

    Dennis

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

  • Hallo,

    Zitat

    Gibt's eine "bessere" GUI Library für meine Zwecke, die auch in angemessener Zeit erlernbar ist?

    GUI-Programmierung ist halt nicht einfach. Unter Python sollte man sich schon zumindest grundlegend mit Objektorientierung, Klassen, deren Methoden und Instanzen auskennen. Außerdem laufen GUI-Programme i.d.R. nicht-linear, d.h. der Mainloop der GUI kontrolliert, wann was / wer dran ist. Das ist gerade für Anfänger manchmal verwirrend, bis man das geblickt hat.

    Klar gibt es Frameworks, die das auf einen höheren Level weg abstrahieren - aber dafür kommt man dann relativ schnell an anderer Stelle an Grenzen, wie du festgestellt hast.

    Die gängigen Frameworks, die auch unter Python genutzt werden, sind Tkinter, Qt und bis zu einem gewissen Grad auch GTK.

    Welches für dich am besten ist, ist schwierig zu sagen, weil wir den Umfang und das genaue Ziel deines Projekts kennen.

    Gruß, noisefloor

  • Nun denn, mal sehen wer zuerst die Nerven verliert über den Code

    Bitte wundert euch nicht über die seltsame Farbgebung, so erkenneich halt besser den Stand der Dinge. Vorallen da die Boxen durchaus Eigenleben enwickeln sobald sie gefüllt werden.

    Die GUI bsteht aus einem Header, einem Footer, und einem geteilten Mittelteil.

    Im Header steht ein dreizeiliges Formular

    Der Footer ist für spätere Statusausgaben vorgesehen

    Im linken Mittelteil befinden sich die Buttons zur Kamerasteuerung und zukünftig (die gelbe Box) auch noch zwei Slider zur Steuerung des Leuchttisches.

    Über PWM werden die blaue nund die grüne Leds gedimmt (MeanWell Power supplies mit PWM Steuerung)

    In der rechten (grünen) Box werden erstmal Thumbnails der gespeichten Images angezeigt.

    Um Fehlermeldungen vorzubeugen

    wird folgende Deiteistruktur benötigt

    /home/pi/Camera

    /home/pi/Pdf

    /home/pi/Pictures

    /home/pi/Thumbs

    meine Python Scripte sehen in /home/pi/Camera

    Übrigens sind mir die Grundsätze der Objektorientierten Programmierung durchaus vertraut, lediglich die Mehrfachverermung kenne ich von PHP her nicht.

    Klassen, Instanzen, Methoden, Eigenschaften (Properties), Funktionen ... sind für mich keine Schimpfwörter sonder Teil meines Programmieralltags.

    Dazu kommt noch Elektronik und andere Hobbies. (Ich habe neine Ausbildung zum Rundfunk- und Fernsehtechniker vor über 50 Jahren beendet.)

    Mein erster Heimcomputer was 1977 eine PDP 11/20 mit einem DEC-Tape als Massensteicher und einer Teletype als Konsole. Googled das mal.

    Meine Programmiersprachen waren damals Fortran, Cobol und Assenbler.

    Basic war auch damals schon eher etwas für Kinder.

    Natürlich bin ich nicht auf diesem Wissen des letzten Jahrtausends stehen geblieben sondern habe mich weiterentwickelt.

    So, nachdem Ihr nun fast meinen Lebenslauf kennt, seid ihr drann.

    Danke für eure Mühe. :danke_ATDE:

  • Hallo,

    der Code ist doch fast passabel...

    • `global`will man normalerweise nicht benutzen, weil es den Zustand des Programms unübersichtlich und schwer bis nicht nachvollziehbar macht. Funktionen übergibt man Parameter explizit. Machst du an den meisten Stellen ja.
    • Keine kryptischen Variablennamen benutzen k, s und t , sondern aussagekräftige Namen. Sonst ist der Code schwer verständlich.
    • `os.system` ist veraltet, das steht sogar wörtlich in der Python-Doku. `subprocess` ist das Modul der Wahl

    So

    Python
    def box_item(app,bg,height,width,align,border,lo):
        ...
        if bg != "":
            box.bg = bg
        ...

    macht man das nicht, sondern:

    Code
    def box_item(app,bg=None,...):
        ...
        if bg:
            box.bg = bg
        ...

    Also Argumente vorbelegen, wenn nicht zwingend was übergeben werden soll.

    Gruß, noisefloor

  • Was soll sich denn durch die GUI inhaltlich/sachlich an der Bedienung ändern?

    Wenn es letztlich das gleiche sein soll, wie die Lösung über Taster an GPIOs, dann könntest du auch ein Nextion-Display nehmen. Das kommuniziert seriell mit dem Pi und kann alles mögliche anzeigen und nette Buttons auf dem Bildschirm zeigen. Nur die Vorschau des Kamerabildes müsste dann wohl auf dem extra Bildschirm bleiben, aber das wäre ja nicht mal so verkehrt.

    Wenns also im wesentlichen drum geht, das Ganze etwas optisch aufzubretzeln, dann wäre das ne relativ einfache Lösung.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Was soll sich denn durch die GUI inhaltlich/sachlich an der Bedienung ändern?

    Wenn es letztlich das gleiche sein soll, wie die Lösung über Taster an GPIOs, dann könntest du auch ein Nextion-Display nehmen.

    Das ist allerdings ein hochinteressanter Ansatz, Auch für einige unserer anderen Projekte. Dem werde ich wohl nachgehen und mir 10" Display (NX1060P101) bestellen. Allerdings wird das wohl erst im nächsten Release des Projektes zum Einsatz kommen.

    Aktuell muss ich den bisherigen Weg weitergehen - auch wenn's mir sehr umständlich erscheint.

    Danke für den Tip.


    global`will man normalerweise nicht benutzen, weil es den Zustand des Programms unübersichtlich und schwer bis nicht nachvollziehbar macht. Funktionen übergibt man Parameter explizit. Machst du an den meisten Stellen ja.

    Richtig, zumal einige der Variablen eigentlich Konstanten sein könnten.

    Einige der genutzten globalen Variablen sind systemweit gültige Statusvariablen auf die ich kaum verzichten kann

    `os.system` ist veraltet, das steht sogar wörtlich in der Python-Doku. `subprocess` ist das Modul der Wahl

    subprocess werde ich mir vornehmen. Wenn ich die Doku gelesen hätte, wäre ich womöglich selber drauf gehommen. Sowas passiert wenn man sich den Code im Netz zusammenklaut.

    Keine kryptischen Variablennamen benutzen k, s und t , sondern aussagekräftige Namen. Sonst ist der Code schwer verständlich.

    Das ist reine Faulheit gewesen und wird im offiziellen Release geändert. Sowas mache ich normalerweise zusammen mit der Doku-Erstellung. Ohne Doku geht bei uns überhaupt nix.

    Aber mich drückt der Schuh ja an einer ganz anderen Stelle: die verdammte GU . Denn ich bin's absolut nicht gewohnt mich schon während des Programmierens bereits um das Layout kümmern zu müssen.

    Hat jemand einen Vorschlag wie ich das Projekt in einen OOP Ansatz bringen kann um dann bei meinen Objekten, möglichst von außen, Margins setzen kann

  • Zitat

    Gibt's einen Weg Logik und Verarbeitung vom Layout zu trennen?

    Bei guizerro, keine Ahnung. Ich nutze den Designer für QT5/6 und die Logik mache ich mit Python.

    Vorzugsweise nutze ich Pyside6, was Qt6 verwendet. Für Qt5 -> Pyside2.

    Das Design speichere ich als .ui Datei ab und kann es mit Python dynamisch laden. So kann man sich auch eigene Widgets erstellen und laden. Die Widgets und anderen Elemente lassen sich über die eindeutige Namensgebung im Python-Code ansteuern.

    So habe ich eine Trennung zwischen Design und Logik. Da du auch was mit CSS geschrieben hast, bei Qt kann man CSS verwenden.

    Es gibt auch qt-material.

    Qt ist ein Monster, aber ein modernes ausgereiftes Monster.

    Der Einstieg ist nicht leicht.

  • Hallo,

    Programmierens bereits um das Layout kümmern zu müssen.

    du kannst ja auch erst die Logik fertig schreiben und danach den Code an das GUI-Framework anpassen. Alles auf einmal ist schon etwas kompliziert. Ich versuche erst die einzelnen Funktionen zu schreiben. Wenn die dann ohne GUI funktionieren, dann schreibe ich diese und packe die Funktionen rein und passe sie entsprechend an.

    Zum Beispiel will ich mit einer eingegebenen Zahl rechnen, dann erst die Funktion:

    Und jetzt ist die Rechnung super wichtig, darum soll es jeder in einem GUI bedienen können, dann schreibe ich die GUI und füge die Funktion ein:

    Sorry das ich kein 'guizero' genutzt habe, aber 'tkinter' war mir für die "schnelle" vertrauter. Hoffe du kannst so in dieser Art dein GUI auch aufbauen.

    Eine Klasse wäre in diesem Minimalbeispiel nicht unbedingt nötig gewesen, aber sobald man sich Werte/Zustände merken muss, wird sie benötigt und ist für die GUI-Programmierung grundlegend.

    Grüße

    Dennis

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

    Einmal editiert, zuletzt von Dennis89 (6. August 2021 um 19:10) aus folgendem Grund: Klammerausdruck entfernt, danke @hyle

  • Sorry das ich kein 'guizero' genutzt habe, aber 'tkinter' war mir für die "schnelle" vertrauter. Hoffe du kannst so in dieser Art dein GUI auch aufbauen.

    Da gibt's nichts zu entschuldigen. Nachdem ich mir auf youtube ein 5,5 Stunden tkinter Tutorial gegönnt habe, weiß ich nun, dass ich guizero besser übersprungen und gleich mit tkinter gestartet hätte. Aus Schaden wird man klug.

    Eine Klasse wäre in diesem Minimalbeispiel nicht unbedingt nötig gewesen, aber sobald man sich Werte/Zustände merken muss, wird sie benötigt und ist für die GUI-Programmierung grundlegend.

    Dein Klassenbeispiel hilft mir erheblich mich bei Python in die OOP einzuarbeiten. Bei PHP mache ich das schließlich auch - aus gutem Grund.

    Danke euch allen für die tolle Unterstutzung, ich werde mich jetzt erstmal auf die Umsetzung der vielen Tips konzentrieren und den Thread erstmal als erledigt markieren. :bravo2: :danke_ATDE::danke_ATDE::danke_ATDE::danke_ATDE::bravo2:

  • Dein Klassenbeispiel hilft mir erheblich mich bei Python in die OOP einzuarbeiten.

    Um die Grundlagen halbwegs zu verstehen hilft Dir ggf. das hier: https://www.python-lernen.de/oop-objektorie…-grundlagen.htm

    Ich würde zwar nich zu 100% für das dort geschriebene meine Hand ins Feuer legen, aber als Einstieg in die OOP ist das imho sehr verständlich dargestellt.

Jetzt mitmachen!

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