Phyton tkinter GUI while Schleife lässt sich nicht beenden.

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo

    Ich bin neu hier und hab ein Problem mit Python tkinter GUI.


    ich hab einen Button über ein event Programmiert der eine while Schleife starten soll. Die while schleife bewirkt das blinken über den Rasbpi.

    Doch sobald ich den Button anklicke startet die Schleife, ich bekomme sie aber danach nicht beendet. Auch habe ich es mit commend versucht. Geht auch nicht. Ich benötige eine Lösung wie die while Schleife bedingt ausfüht. Z.B. mit Button start und stop.
    Als Bsp mein Programm zum anschauen.

    Wer kann mir helfen. Bitte bedenkt ich bin noch neu hier und eine erklärung für Anfänger wäre von Vorteil.
    Besten Dank

  • Phyton tkinter GUI while Schleife lässt sich nicht beenden.? Schau mal ob du hier fündig wirst!

  • Moin,
    wie findest du diesen Vorschlag??

    Code
    def schalteAus(self,event):
    
    
           print('aus') # DEBUG

    Obige Funktion setzt eine globale Variable.
    In der while-Schleife fragst du die globale Variable ab.

    Ich kann die mit Programmbeispielen nicht helfen, weil nix python und GUI-Programmierung erst recht nicht ;-))

    Gruss Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

    Einmal editiert, zuletzt von Bernd666 (31. März 2016 um 22:48)

  • Etwas in der folgenden Art könnte helfen:

  • Bernd: was soll denn das bewirken? Das Problem ist ja nicht, dass der Code nicht ausgefuehrt wird. Im Gegenteil. Er *wird* ausgefuehrt. Nur ist das blinken ohne Timer nicht zu machen. Ausser man greift zu Threads, was man nicht tun sollte, weil es nur mehr Probleme macht, und darum - wenn irgend moeglich - vermieden werden sollte.

  • Mein Gedanke war schon eine Scrypt Datei blinken abzulegen in den Ordner TESTGUI und diese über die Gui TK Inter zu öffnen bzw auszuführen.

    Bekomme ich aber auch nicht hin.

    An _deets_ können sie mir das ganze etwas konkreter erklären. Wäre nett und ich wäre Ihnen sehr Verbunden denn ich möchte es auch verstehen.

    Vielen Dank

  • @__deets__: mhm, ich hatte es so gelesen, das die while-schleig´fe nicht verlassen wird..

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Bernd666 wird sie ja auch nicht. Aber sie darf gar nicht erst existieren, weil eine Endlosschleife & eine GUI nicht zusammen funktionieren koennen.

    Schnully hast du die Antwort in dem Stackoverflow-Posting mal ausprobiert? Es funktioniert (mit Python3) fuer mich problemlos, und blinkt vor sich hin.

  • Hey vielen Dank bis jetzt

    das funktioniert. Aber nur Grafisch.

    Aber mit den GPIO s nicht. Schade das eine eine While Schleife in tkinter nicht ausgefüht werden kann.

    Wenn ich Blinken und Ampel Lichterkette als eigenständiges Programm abspeichere. z.b. In den Ordner TESTPROGRAMME.

    Wie kann ich diese mit einem Button über tkinter ausführen starten bzw beenden. Mein Ziel über die Gui all meine Projekte über Button starten.

    Vielleicht ist das die Lösung.

  • Wieso funktioniert das mit GPIOs nicht? Alles was du tun musst ist die blink-Methode so abzuaendern, dass die GPIOs geschaltet werden:

    Code
    def blink(self):
            if self.do_blink:
                current_color = self.canvas.itemcget(self.rect, "fill")
                new_color = "red" if current_color == "white" else "white"
                self.canvas.itemconfigure(self.rect, fill=new_color)
                GPIO.output(4, new_color == "red")
                self.after(1000, self.blink)
  • Was heisst "geht nicht". Der Rest des GPIO-Setups muss natuerlich auch erfolgen, so wie vorher auch! Hast du das gemacht?

  • from tkinter import *

    class MyApp(Tk):
    def __init__(self):
    Tk.__init__(self)
    fr = Frame(self)
    fr.pack()
    self.canvas = Canvas(fr, height = 100, width = 100)
    self.canvas.pack()
    self.rect = self.canvas.create_rectangle(25, 25, 75, 75, fill = "white")
    self.do_blink = False
    start_button = Button(self, text="start blinking",
    command=self.start_blinking)
    stop_button = Button(self, text="stop blinking",
    command=self.stop_blinking)
    start_button.pack()
    stop_button.pack()

    def start_blinking(self):
    self.do_blink = True
    self.blink()

    def stop_blinking(self):
    self.do_blink = False

    def blink(self):
    if self.do_blink:
    current_color = self.canvas.itemcget(self.rect, "fill")
    new_color = "red" if current_color == "white" else "white"
    self.canvas.itemconfigure(self.rect, fill=new_color)
    #LED aus
    GPIO.output(4, GPIO.LOW)
    # eine Sekunde warten
    time.sleep(1)
    #LED an
    GPIO.output(4, GPIO.HIGH)
    # eine Sekunde warten
    time.sleep(1)

    self.after(1000, self.blink)


    if __name__ == "__main__":
    root = MyApp()
    root.mainloop()

    Nein geht nich. Oh sorry mein guter

  • In dem Code sehe ich weder den GPIO import, noch das setup, noch die Aenderung von blink wie ich sie gezeigt habe, sondern den timer-basierten Code, der nicht funktionieren wird (bzw. die Gui fuer 2 Sekunden einrueckt). Ja, dann funktioniert's nicht, mein Bester :)

  • Boah alter Schwede es läuft. Das war mein fehler danke!!!!!!!!!!!!! Hab die GPIO Ausgänge vergessen.

    Etwas ruppig aber es läuft. Vielen vielen Dank. Ich werde daran noch etwas herum experimentieren. Ist aber ein guter Anfang.

    Kannst du mir oder dem nächsten Leser erklären warum es so geht.

    Dann werde ich dieses Problem als gelöst melden.

    Danke Super _deets_

  • Es sollte nicht ruckeln, ich vermute du hast immer noch die time.sleeps drin. Stattdessen muss die Umschaltung abhaengig vom Vorzustand erfolgen. Und wie Erklaerung steht im ersten Posting: eine GUI muss auf Benutzerereignisse reagieren, dazu braucht sie eine Hauptschleife. Deshalb darf man immer nur sehr kurze Aktionen ausfuehren, und periodisches muss in Timern erfolgen.

  • Hallo,

    da hier nicht die komplette Lösung gennant wurde, hier mein Listing:


    Achtung: der LED-Ausgang wurde für mein Testboard geändert.

    MfG

    Juergen B.

Jetzt mitmachen!

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