Tkinter Button nehmen auch deaktiviert Befehle an

  • Schönen Guten Abend liebes Forum,

    Ich bräuchte mal wieder eure Hilfe: Ich habe mal alles andere rausgelöscht um es übersichtlicher zu machen. Habe ein Programm mit GUI geschrieben bei dem ich über mit TKinter erzeugte Button, Schrittmotoren von A nach B fahren lassen kann. Während ein Schrittmotor sich bewegt sollen die GUI-Button deaktiviert werden damit man nicht zweimal drauf tippen kann und sich die Befehle stapeln. Das sperren/ disablen von den Button funktioniert aber leider nur bedingt. Zwar sind sie auf dem GUI ausgegraut, nehmen aber trotzdem noch Befehle an die dann der Reihe nach abgearbeitet werden. Wenn ich den Button nach dem Ablauf der Funktion nicht wieder entsperre nimmt er auch keine Befehle mehr an, also so wie es eigentlich sein sollte:conf:

    Habe es bis jetzt auf diese zwei Arten versucht:

    1. Das Sperren und Entsperren als eigene Funktion und diese vor und nach der Funktion zum bewegen des Schrittmotors abrufen

    2. Das Sperren des Button direkt mit in die Funktion rein, also am Anfang und Ende der for-loop.

    Hat jemand eine Idee voran es liegt?

    Code
    def Plus():    
        b1["state"] = "disabled"    
        for i in range(200):        
            GPIO.output(A1S, True)        
            time.sleep(0.0018)        
            GPIO.output(A1S, False)    
        b1["state"] = "normal"
  • Hallo,

    das (dein) Problem ist, dass die for-Schleife den mainloop blockiert, d.h. Tkinter bekommt erst mit, dass die Schaltfläche inaktiv ist (und damit `command` nicht ausgeführt wird), wenn die Funktion zurück kehrt. Klickst du währenddessen, wird `command` immer wieder aufgetrufen.

    Lösung: Die Funktionen nacheinander über die `after` Methode mit einer kleinen Verzögerung (hier: 10 ms) aufrufen. Dann wird zwischendurch immer wieder zum Mainlopp zurückgekehrt und es läuft so, wie es soll.

    Ansonsten: keine Sternchehn-Importe, weil die böse sind und alle GUIs, die nicht mega-trivial sind, klassenbasiert schreiben.

    Gruß, noisefloor

Jetzt mitmachen!

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