GUI zu Python?

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

    ich habe jetzt meine ersten Gehversuche mit Python, Motoren und Sensoren hinter mir und möchte gerne jetzt einen neuen Schritt gehen.

    Und zwar würde ich gerne zu meinem Python-Skript eine GUI bauen um a) diverse laufende Variablen anzuzeigen b) im Skript eingreifen zu können bei div. Funktionen.

    Leider habe ich keinerlei Ahnung wie ich es angehe oder wonach ich googeln soll.

    Im speziellen suche ich eventuell auch eine Möglichkeit visualisiert zu arbeiten (wie zb bei Visual Studio von Microsoft) damit ich nicht mühsamst erst Fensterbreiten, Farben, Buttons usw per Code einfügen muss.

    An sich sind meine Anforderungen trotzdem sehr minimal:

    • 2 Buttons die Funktionen starten
    • 1 Diagramm mit Echtdaten
    • ein paar Text-Infos wo Variablenwerte angezeigt werden

    danke


    Michael

  • Ich weiß zwar nicht welche Suchmaschinen ihr so verwendet, aber eigentlich sollte jeder bei Eingabe der hier gesetzten Überschrift etwas brauchbares ausgeben... Zum Beispiel über Google gleich die ersten 3 Treffer

    Allerdings - und das sollte man hervorheben - glaube ich nicht das du unbedingt eine GUI wirklich benötigst. Für die meisten Projekte reicht es ein Webinterface zu basteln, das geht schnell und auch relativ einfach. Ausserdem bist du dann auch nicht auf eine recht CPU+RAM lastige X11 (Desktopumgebung) angewiesen oder sogar einem Monitor am PI.


  • Im speziellen suche ich eventuell auch eine Möglichkeit visualisiert zu arbeiten (wie zb bei Visual Studio von Microsoft) damit ich nicht mühsamst erst Fensterbreiten, Farben, Buttons usw per Code einfügen muss.

    Kannst dir ja mal PyQt4 anschauen. Das Paket beinhaltet einen Designer, wo du deine GUI zusammenklicken kannst.
    Für Graphen etc in 'Echtzeit' biete sich das hier an.


  • Allerdings - und das sollte man hervorheben - glaube ich nicht das du unbedingt eine GUI wirklich benötigst. Für die meisten Projekte reicht es ein Webinterface zu basteln, das geht schnell und auch relativ einfach. Ausserdem bist du dann auch nicht auf eine recht CPU+RAM lastige X11 (Desktopumgebung) angewiesen oder sogar einem Monitor am PI.

    Hey meigrafd, danke für deine Antwort...
    der Ansatz gefällt mir sehr gut.

    Ein Webinterface würde mir sehr gefallen... bin auch ein wenig weiter als ein Einsteiger mit PHP und fortgeschritten mit Datenbanken.

    Nur wie kann ich per Webinterface in ein laufendes Python-Programm eingreifen? Das erschließt sich mir noch nicht ganz. Gibt es dazu Links, Infos,... ?

    danke


  • Nur wie kann ich per Webinterface in ein laufendes Python-Programm eingreifen? Das erschließt sich mir noch nicht ganz. Gibt es dazu Links, Infos,... ?
    danke

    Am einfachsten wäre es wohl, ein Microframework wie zB Bottle zu verwenden.

    Python
    from bottle import route, run, template
    
    
    @route('/hello/<name>')
    def index(name):
        return template('<b>Hello {{name}}</b>!', name=name)
    
    
    run(host='localhost', port=8080)
  • Nur wie kann ich per Webinterface in ein laufendes Python-Programm eingreifen? Das erschließt sich mir noch nicht ganz. Gibt es dazu Links, Infos,... ?

    Das kommt darauf an, wie du eingreifen willst

    Um was für ein Python Script handelt es sich, was macht das, was willst du beeinflussen :huh:

    Es wäre Sinnvoll deinen Code zu posten und detailliert zu beschreiben was du vor hast oder erreichen möchtest

  • Da muss man nur nach dem richtigen Googeln, da stand ich auch schon mal wie ein Ochs vorm Berg, weil ich dachte die Begriffe nach denen ich suche waren klar, aber hab immer nur Ergebnisse gekriegt die genau andersrum waren als das was ich brauchte.

    Also für diesen Fall wäre z.B. diese Stichworte passend:
    python embedded web server
    oder
    embedded web interface

  • Das kommt darauf an, wie du eingreifen willst

    Um was für ein Python Script handelt es sich, was macht das, was willst du beeinflussen :huh:

    Es wäre Sinnvoll deinen Code zu posten und detailliert zu beschreiben was du vor hast oder erreichen möchtest

    Ich bastel gerade an einer Hausautomatisierung und bin aktuell bei einem Fenster Öffnen/Schließ Mechanismus der an sich gut funktioniert bis jetzt.

    Das Problem ist dass ich aufgrund der verschraubten Motoren das Fenster jetzt nicht nach Lust und Laune öffnen kann, was unpraktisch ist.

    Deswegen möchte ich gerne eine "Funktion" per Button aufrufen damit das Fenster geöffnet wird, optimalerweise über den Browser denn dann kann ich das ganze sogar am Handy bedienen.

    Um das "overrulen" des Codes (der ansonsten aktiv ist) kann ich mich selbstständig kümmern, ich weiß bis jetzt bloss noch nicht wie ich das per Webinterface realisieren kann.

    RyuKajiya danke! werd ich mir ansehen

  • Das beantwortet leider keine meiner Fragen, bin jetzt quasi genauso so Schlau wie vorher :lol:

    Um dein Anliegen sinnvoll beantworten zu können müsste man wissen wie dein Projekt aufgebaut ist - gibt es eine zentrale Datei die alles steuert, oder gibt es mehrere Dateien zum ansteuern der Motoren usw.

    Sicherlich könnte man jetzt daher gehen und dir dies oder jenes raten, woraufhin du dann alles umbauen müsstest - was aber vermutlich eh der Fall sein wird, nur nicht unbedingt alles...


    Man kann also natürlich eine Webseite bauen mit 2 Knöpfen, welche dann einfach einzelne Python Scripts ausführen. Forumsuche nach: sudo webscript
    Aber ob diese Möglichkeit sinnvoll ist, können Wir bisher nicht beurteilen ;)

    Und natürlich gibt es wie Immer nicht nur eine Lösung - es gibt Immer unzählige Variationen wie man etwas umsetzen kann... Nativ über Python und zB tornado, oder Nativ in PHP, oder in Bash oder was auch immer...... Man könnte dir jetzt ziemlich viel vorschlagen, vermutlich kommt hier nach noch jemand und postet eine weitere Möglichkeit :fies:


  • Das beantwortet leider keine meiner Fragen, bin jetzt quasi genauso so Schlau wie vorher :lol:

    Um dein Anliegen sinnvoll beantworten zu können müsste man wissen wie dein Projekt aufgebaut ist - gibt es eine zentrale Datei die alles steuert, oder gibt es mehrere Dateien zum ansteuern der Motoren usw.

    Versteh ich natürlich....
    hier mein Code (Passwörter, Zeiten, Keys usw entschärft):

    Kurz zur Erklärung was das soll:
    Ich messe mit 1 Sensor die Raumtemperatur die sich ständig zwischen zb 22 und 26 bewegen soll. Wird es zu heiß soll das Fenster aufgehen, sinkt die Temperatur unter 22 geht das Fenster zu. Das ganze realisiert ein gewöhnlicher Servo der sich (deshalb die vielen Schritte) langsam bewegen soll damit das Fenster nicht zugeknallt wird.

    Ich messe immer 1x pro Minute und berechne den Schnitt und diesen ziehe ich heran.
    Jedes mal Fenster auf oder zu wird in einem Google-Spreadsheet hochgeladen.

    Beim starten des Programms wird das Fenster geschlossen.

    An sich wäre ein manuelles Fenster AUF oder ZU per Button sinnvoll.
    Dass der andere Code dann eben nicht mehr "zieht" solange der Button aktiv ist (oder die Checkbox) krieg ich sicher alleine hin.

    Fazit: 2 Python-Skript´s. 1x eines um den Sensor auszulesen und dieses hier für den Rest.

    lg & danke

    p.s. bitte nicht schlagen für die nicht ganz Programmier-Konforme Kommentierung und den Variablennamen

  • Hm also zu nächst mal könntest du eine ganze Menge Code einsparen wenn du bei dem PWM Krams einfach eine Schleife verwendest in der gerechnet wird, zum Beispiel in etwa so:
    [code=php]
    def pwmServo(start, direction):
    diff = 7.5
    if direction == "auf":
    end = (start + diff)
    elif direction == "zu":
    end = (start - diff)
    Score = start
    p = GPIO.PWM(11, 50)
    p.start(start)
    p.ChangeDutyCycle(start)
    time.sleep(0.2)
    while Score > end:
    if direction == "auf":
    Score = Score + 0.2
    elif direction == "zu":
    Score = Score - 0.2
    p.ChangeDutyCycle(Score)
    time.sleep(0.2)

    pwmServo(5.0, "auf")
    pwmServo(12.5, "zu")
    [/php]

    Dann sollte dein Script schon mal kleiner werden..

    Zur Frage wie du das separat über Buttons steuern kannst wäre denk ich das einfachste wenn du 2 zusätzliche Python Script verwendest, in denen du dieses eine importierst und in dem einen fensterauf() bzw in dem anderen fensterzu() aufrufst. Diese beiden Scripts kannst du dann über ein WebInterface (php) ausführen -> siehe dazu zB Forumsuche nach " sudo webscript"

    Um dann zu verhindern das dein Hauptscript deiner Button-Aktion dazwischen funkt würde ich eine temporäre Datei erzeugen, also beim drücken auf den Auf oder Zu Button wird eine Datei /tmp/Fenster angelegt welche dein Hauptscript auf Existenz prüft, existiert die Datei funkt das Hauptscript nicht dazwischen.... Dann brauchst du aber eben auch noch einen 3.Button um diese temporäre "lock"-Datei auch wieder zu entfernen ;)


  • Hm also zu nächst mal könntest du eine ganze Menge Code einsparen wenn du bei dem PWM Krams einfach eine Schleife verwendest in der gerechnet wird, zum Beispiel in etwa so:
    Dann sollte dein Script schon mal kleiner werden..

    Zur Frage wie du das separat über Buttons steuern kannst wäre denk ich das einfachste wenn du 2 zusätzliche Python Script verwendest, in denen du dieses eine importierst und in dem einen fensterauf() bzw in dem anderen fensterzu() aufrufst. Diese beiden Scripts kannst du dann über ein WebInterface (php) ausführen -> siehe dazu zB Forumsuche nach " sudo webscript"

    Um dann zu verhindern das dein Hauptscript deiner Button-Aktion dazwischen funkt würde ich eine temporäre Datei erzeugen, also beim drücken auf den Auf oder Zu Button wird eine Datei /tmp/Fenster angelegt welche dein Hauptscript auf Existenz prüft, existiert die Datei funkt das Hauptscript nicht dazwischen.... Dann brauchst du aber eben auch noch einen 3.Button um diese temporäre "lock"-Datei auch wieder zu entfernen ;)

    Danke dir sehr herzlichst für deine Mühe! Das mit der Verkleinerung hatte ich zu Beginn in einer Schleife, habe ich aber dann wieder zurückgebaut weil die Servohornbewegung so immer linear war....und das war unpassend.

    Zb brauch ich beim öffnen zu Beginn mehr Power und Schnelligkeit (um das Fenster aus der Dichtung zu kriegen) und dann darf es ruhig und langsamer weitergehen.
    Das selbe beim zumachen..... zuerst ruhig und gemütlich (wegen der Maße) und die letzten 3cm dann mit Schwung und Geschwindigkeit.

    So schließt und öffnet das ganze besser.

    Die Idee mit den Dateien find ich gut....ich habe mir darüber Gedanken gemacht.
    Kann man denn mit diesem Embedded Webserver/Interface nicht direkt "option boxes" abrufen bzw. abfragen?

    Weil wenn ja... mach ich einfach 3 davon:

    o) keine Aktion
    o) Fenster zwingend auf
    o) Fenster zwingend zu

    Es ist nur eine davon wählbar. Kriegt mein Skript mit dass Option2 gewählt wurde rufe ich fensterauf() auf und setzte (zb) Variable overrule=1 .....oder eben Option3 dann fensterzu().

    Und um das Gesamtkonstrukt baue ich ein "if not overrule==1:" damit es arbeitet....oder eben nicht.

    Wäre doch noch einfacher, ich brauch keine 3 Dateien.

    Ich weiß eben nur noch nicht ob das mit diesem "embedded" so machbar ist.

    lg


  • Kann man denn mit diesem Embedded Webserver/Interface nicht direkt "option boxes" abrufen bzw. abfragen?

    Kann ich bei der Fragestellung davon ausgehen das du noch nie HTML/PHP programmiert hast :huh:

    Ob du jetzt einzelne Buttons oder Checkbox's verwendest, ist relativ wurscht. Aber ich glaub du wärst mit sog. 'Radio Buttons' besser dran :fies:

    Und um das Gesamtkonstrukt baue ich ein "if not overrule==1:" damit es arbeitet....oder eben nicht.

    Naja, und wie übergibst du diese python Variable an dein Hauptscript, ohne dieses erneut auszuführen :huh:

    Die einzige Möglichkeit dies zu erreichen wäre, entweder über:

    • Ein Socket
    • Auslesen einer Datei


    Bei 1. könnte man über einen WebSocket eine Verbindung zum Hauptscript (über einen bestimmten Port) ein Befehl absetzen, der wiederum vom Python Script abgefangen und innerhalb des Scripts eine Laufzeit-Variable setzt.

    Bei 2. müsste das Hauptscript eben vor dem Ausführen einer Aktion eine Datei auslesen und zB Inhaltlich auf "overrule=1" oder "overrule=0" prüfen...

Jetzt mitmachen!

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