Steuerung Visualisieren

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo Leute
    Komme einfach nicht weiter, ich habe eine Pumpensteuerung die ich mit einer GUI von Reparatur auf Automatic umstellen möchte.
    Auf Rep. soll man die Pumpe via anklicken der Buttens ansteuern können. Das Funktioniert auch.
    Klicke ich auf den Automatic Button, soll die Pumpe sich über zwei Schwimmerschalter selber steuern. Das geht auch.
    Nun hängt das Programm aber in der Automatic Schleife und auf das GUI kann ich nicht mehr zugreifen.
    Frage: Wie muss ich das Programm ändern damit die GUI weiter in Betrie bleibt?
    Kann mir jemand helfen? Würde mich über Antworten sehr freuen.

    :danke_ATDE:
    Hier mein Programm:

    import RPi.GPIO as GPIO
    import time
    from Tkinter import *
    import tkMessageBox
    Niveauoben = 18
    Niveauunten = 24
    Trommelfilter = 13
    GPIO.setmode (GPIO.BOARD)
    GPIO.setup (Trommelfilter, GPIO.OUT) #Motor Trommelfilter
    GPIO.setup(Niveauoben, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    GPIO.setup(Niveauunten, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    GPIO.output(Trommelfilter, GPIO.LOW)
    GPIO.setwarnings(False)


    def schleife(): #Automatikbetrieb
    while 1:
    if GPIO.input(Niveauoben) == GPIO.HIGH and GPIO.input(Niveauunten) == GPIO.HIGH:
    GPIO.output(Trommelfilter, GPIO.HIGH)
    if GPIO.input(Niveauoben) == GPIO.LOW and GPIO.input(Niveauunten) == GPIO.LOW:
    GPIO.output(Trommelfilter, GPIO.LOW)
    def ledon13(): #Reparaturbetrieb
    GPIO.output (Trommelfilter,True)
    def ledoff13(): #Reparaturbetrieb
    GPIO.output (Trommelfilter,False)
    def check_button():
    if (GPIO.input(Niveauoben) == GPIO.LOW):
    labelText.set("Trommel Stop")
    else:
    labelText.set("SPÜLVORGANG")
    root.after(10,check_button)


    root =Tk()
    root.geometry("516x390")
    root.title("Filter Reparatur")

    button1 = Button(root, fg="GREEN", text="Trommel ON", command=ledon13)
    button2 = Button(root, fg="RED", text="Trommel OFF", command=ledoff13)
    button10 = Button(root, fg="BLUE", text="AUTOMATIK", command=schleife)
    button3 = Button(root, fg="BLUE", text="EXIT", command=exit)
    button1.place(x=158, y=48, width=120, height=54)
    button2.place(x=38, y=48, width=120, height=54)
    button10.place(x=38, y=288, width=240, height=54)
    button3.pack (side = TOP)
    labelText = StringVar()
    label1 = Button(root, textvariable=labelText, height=4, bg="GREEN")
    label1.place(x=308, y=48, width=120, height=54)
    root.after(10,check_button)
    root.mainloop ()

  • [code=php] # -*- coding: utf-8 -*-
    import RPi.GPIO as GPIO
    import time
    from Tkinter import *
    import tkMessageBox
    Niveauoben = 18
    Niveauunten = 24
    Trommelfilter = 13
    GPIO.setmode (GPIO.BOARD)
    GPIO.setup (Trommelfilter, GPIO.OUT) #Motor Trommelfilter
    GPIO.setup(Niveauoben, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    GPIO.setup(Niveauunten, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    GPIO.output(Trommelfilter, GPIO.LOW)
    GPIO.setwarnings(False)

    def schleife(): #Automatikbetrieb
    while 1:
    if GPIO.input(Niveauoben) == GPIO.HIGH and GPIO.input(Niveauunten) == GPIO.HIGH:
    GPIO.output(Trommelfilter, GPIO.HIGH)
    if GPIO.input(Niveauoben) == GPIO.LOW and GPIO.input(Niveauunten) == GPIO.LOW:
    GPIO.output(Trommelfilter, GPIO.LOW)

    def ledon13(): #Reparaturbetrieb
    GPIO.output (Trommelfilter,True)
    def ledoff13(): #Reparaturbetrieb
    GPIO.output (Trommelfilter,False)
    def check_button():
    if (GPIO.input(Niveauoben) == GPIO.LOW):
    labelText.set("Trommel Stop")
    else:
    labelText.set("SPÃœLVORGANG")
    root.after(10,check_button)

    root =Tk()
    root.geometry("516x390")
    root.title("Filter Reparatur")

    button1 = Button(root, fg="GREEN", text="Trommel ON", command=ledon13)
    button2 = Button(root, fg="RED", text="Trommel OFF", command=ledoff13)
    button10 = Button(root, fg="BLUE", text="AUTOMATIK", command=schleife)
    button3 = Button(root, fg="BLUE", text="EXIT", command=exit)
    button1.place(x=158, y=48, width=120, height=54)
    button2.place(x=38, y=48, width=120, height=54)
    button10.place(x=38, y=288, width=240, height=54)
    button3.pack (side = TOP)
    labelText = StringVar()
    label1 = Button(root, textvariable=labelText, height=4, bg="GREEN")
    label1.place(x=308, y=48, width=120, height=54)
    root.after(10,check_button)
    root.mainloop ()

    [/php]

  • Hallo,
    ich habe dein Programm noch nicht ganz durchblickt. Wird die Schleifen-Funktion überhaupt irgendwo genutzt?

    Du solltest deine Automatik-Funktion in einen extra Thread stecken damit deine Auswahl weiter läuft.
    Um das Programm übersichtlich zu halten solltest du die GUI von der Steuerung trennen. Vielleicht hilft es auch wenn du die Steuerung zunächst in einem kleinem Consolen-Tool ausprobierst und dann hinterher die GUI programmierst.

    Einmal editiert, zuletzt von cwmg (9. Mai 2014 um 08:48)

    • Offizieller Beitrag

    Moinsen,

    cwmg
    die funktionen werden aber über die buttons gestartet.

    @(oh) pistolero (auf der Strasse nach Mexico...) :)
    cwmg gibt das Richtige Stichwort, nur das ich nicht MultiThreaden sondern MultiProcessen würde. Der Vorteil liegt im Detail. Threads sind nicht dazu gedacht beendet zu werden, Prozesse schon.
    [code=php]
    from multiprocressing import Process
    auto_loop= Process(target=schleife, args=())
    auto_loop.start()[/php]

  • Hallo
    Danke schon einmal für eure Antworten. Schnalle aber gerade mal nicht was ich tun soll.
    Also wenn ich Button 10 betätige springe ich in die Schleife und alles ist gut. Doch jetzt wird die GUI ja nicht mehr abgerufen. Wenn ich es hin bekommen würde sie weiter in Betrieb zu lassen, möchte ich durch erneutes anklicken von Button 10 wieder zurück zum Rep.Betrieb.
    Da ich absoluter Anfänger bin, bitte ich noch um ein wenig Hilfe und vor allem euer Verständniss für meine Unwissenheit.
    :blush:

    • Offizieller Beitrag

    Schau dir mein Beispiel von oben an...was machen diese 3 Zeilen genau:
    die erste import das multiprocossing modul (muss demnach ganz nach oben zu deinen anderen imports)
    Die zweite Zeile st schon interessanter, sie weisst der auto_loop variable (kann auch leberwurst heissen) eine Instanz der Multiprocessing Klasse zu.Sprich: auto_loop bereitet alles sowas vor, damit das ziel (target=schleife) neben den anderen aufgaben laufen kann.
    auto_loop.start() setzt den ganzen vorgang dann in gang. Sprich ab dieser Zeile wird deine Schleife ("im hintergrund", parallel) zu deinen anderem Quellcode ausgeführt.

    Was du jetzt machen musst, ist deinem Button zu sagen, dass wenn du ihn drückst, er nicht mehr "schleife" direkt aufrufen soll sondern den eben beschrieben weg gehen soll. Eine Möglichkeit das ganze zu beenden brauchst du natürlich auch noch. Wie man Prozeese beendet steht in der Doku vom Multiprocessing modul.

  • Bin gerade auf der Arbeit, werde morgen mal ausprobieren ob die Zeile 2+3 richtig positioniert bekomme.
    Wenn ich die selbe GUI auch in der Schleife am laufen bekomme sollte der Rest kein Problem sein.
    Hoffe ich :shy:

    Bootsmann dir noch einen schönen Abend.
    Prost !

    Einmal editiert, zuletzt von pistolero1904 (9. Mai 2014 um 23:00)

  • Moin,

    ich bin kein GUI Spezialist aber schau dir mal die 'after' Methode von TK an. Das könnte genau das sein, was du brauchst. Beim Aufruf dieser Methode kannst du angeben, wann (in ms) deine Funktion wiederholt aufgerufen werden soll.

    [code=php]
    def automatik():
    if GPIO.input(Niveauoben) == GPIO.HIGH and GPIO.input(Niveauunten) == GPIO.HIGH:
    GPIO.output(Trommelfilter, GPIO.HIGH)
    root.after(1, automatik)

    elif GPIO.input(Niveauoben) == GPIO.LOW and GPIO.input(Niveauunten) == GPIO.LOW:
    GPIO.output(Trommelfilter, GPIO.LOW)
    root.after(1, automatik)[/php]


    Quelle:
    http://effbot.org/tkinterbook/wi…et.after-method

  • Hallo
    so, nach einer Woche experimentieren habe ich die Schleife jetzt im Hintergrund laufen.
    Dafür schon einmal recht herzlichen dank. :thumbs1:
    Wie dbv schon ahnte, bin ich jetzt nicht in der Lage das Multiprocess zu beenden. :helpnew:
    Wie lautet die Anweisung?
    Kannst du mir bitte noch ein wenig auf die Sprünge helfen?
    Wo finde ich die Doku zum Multiprocessing Modul?

    Einmal editiert, zuletzt von pistolero1904 (18. Mai 2014 um 10:57)

Jetzt mitmachen!

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