Abbruch Button während Programm noch läuft

Fragen zu Tkinter.
Antworten
DougIvey
User
Beiträge: 2
Registriert: Freitag 22. Januar 2016, 16:17

Hey Leute,

habe ein Problem. Ich habe ein "Start" Button der eine Funktion ("Zeitschleife")ausführt, welche sich immer wieder selber aufruft (Ruf Funktion "liste" jede Minute). Quasi eine Endlosschleife. Und ich habe einen Abbruch Button. Funktioniert auch alles wie es soll. Außer wenn ich den Start Button gedrückt habe und das Porgramm läuft, kann ich nicht mehr den Abbruch Button betätigen. Wie bekomme ich das hin das ich das Porgramm mittels eines Buttons beenden kann, obwohl die Schleife im "Start" Button noch läuft.

Hier der relevante Ausschnitt:

Code: Alles auswählen

def quit():
        master.destroy()

def Zeitschleife():
        print "<1 Minute warten bis zur nächsten Konvertierung..."
        schedule.every(1).minutes.do(listen)

        while True:
            schedule.run_pending()
            time.sleep(1)

master = Tkinter.Tk()

Button(master, text='Beenden', command=quit, state=ACTIVE ).grid(row=4, column=0, sticky=W, pady=4)

Button(master, text='Start', command=Zeitschleife).grid(row=4, column=1, sticky=W, pady=4)

mainloop()
Es muss ja machbar sein, das ich den "Abbruch" Button wieder aktivieren kann, auch wenn der "Start"Button schon einmal aktiviert wurde.

Danke schonmal für eure Hilfe.

Gruß
Doug
Zuletzt geändert von Anonymous am Freitag 22. Januar 2016, 17:17, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@DougIvey: Solange diese Schleife läuft, kehrt die Funktion nicht zur Tk-Hauptschleife zurück und solange das nicht passiert ist die GUI ”tot”, weil die Tk-Hauptschleife laufen muss damit die GUI aktualisiert werden kann und auf Ereignisse wie Benutzereingaben reagieren kann. Rückruffunktionen aus der GUI dürfen nur kurz etwas machen und müssen dann zum Aufrufer zurückkehren, sonst blockieren sie die GUI.

Wenn Du etwas länger laufendes brauchst, musst Du die Aufgabe entweder auf viele kurze Schritte aufteilen, welche dann mittels `Widget.after()` oder `Widget.after_idle()` nacheinander abgearbeitet werden, oder die Aufgabe beispielsweise mittels `threading`-Modul nebenläufig starten.

Der Quelltextausschnitt sieht übrigens nicht besonders gut aus. Da lässt sich ein Sternchen-Import erkennen, Du hast Variablen auf Modulebene, und versuchst GUI-Programmierung ohne objektorientierte Programmierung. Alles für sich alleine schon Rezepte für wüsten, unüberschaubaren, und damit schlecht erweiter- und wartbaren Code. Ein Blick in den Style Guide for Python Code könnte auch nicht schaden. `Zeitschleife` beschreibt keine Tätigkeit und ist damit kein guter Name für eine Funktion oder Methode.
DougIvey
User
Beiträge: 2
Registriert: Freitag 22. Januar 2016, 16:17

Erstmal danke BlackJack für die Antwort.

Okay Problem habe ich schonmal verstanden.
Ich glaube "Threading" ist das was ich brauche, auch wenn ich damit noch nie gearbeitet habe und keine Ahnung hab wie es funktioniert, aber hört sich so an als ob es das ist:) Ich werde mal schauen.

Generell bin ich kein großer Programmierer und deswegen mag mein "Style" auch nicht besonders gut sein, es soll funktionieren, das ist mein Ziel;)
Aber torzdem werde ich mich bei Gelegenheit mit dem Style Guid auseinandersetzen.
BlackJack

@DougIvey: Stil hat nicht nur etwas mit Optik oder Ästhetik zu tun, sondern das man Sachen sauber, leicht lesbar, und konsistent macht. Denn das vermeidet Fehler und erleichtert das testen und wiederverwenden, und das erweitern, und überarbeiten von Code ohne das man sich allzu leicht Fehler einbaut.
Antworten