Fehlermeldung beim Beenden Countdown Timer

Fragen zu Tkinter.
Antworten
twinsen
User
Beiträge: 2
Registriert: Sonntag 5. Juni 2016, 22:18

Sonntag 5. Juni 2016, 23:15

Hallo liebe Python-Gemeinde,

ich bin dabei, einen kleinen runterzählenden Countdowntimer in Minuten und Sekunden (mit einem Start- und Quit-Button) zu erstellen. Es läuft eigentlich alles ganz gut, das Script startet und macht auch was es tun soll. Nur beim Beenden des Scripts bringt er mir folgende Fehlermeldung:

Code: Alles auswählen

_tkinter.TclError: can't invoke "update" command: application has been destroyed
Leider hat mir die SuFu nicht weiterhelfen können, Lösungsansätze in Google hab ich gefunden, aber bei der Umsetzung bin ich gescheitert :? Schon ewig nicht mehr programmiert. Ich habe herausgefunden dass die update()-Methode nicht ausgeführt werden kann, da ich das GUI bereits beendet habe, außerdem sollte ich besser die after()-Methode nutzen anstatt der update()-Methode. Statt root.update() in der Funktion count_down, probierte ich root.after(1, count_down) und über root.mainloop() root.after_idle(count_down), im Code gekennzeichnet als Kommentar.

Ich hoffe Ihr könnt mir weiterhelfen und bedanke mich im Voraus.

IDE: PyCharm

Hier mein Code:

Code: Alles auswählen

from tkinter import *
from tkinter import ttk
import time

fango1 = 20

def count_down():
    for t in range(fango1*60, -1, -1):
        sf = "{:02d}:{:02d}".format(*divmod(t, 60))
        time_str.set(sf)
        root.update() #root.after(1, count_down)
        time.sleep(1)

def exit():
 root.destroy()

root = Tk()
root.wm_title('Übersicht Belegung')

time_str = StringVar()

sf2 = "{}:{:02d}".format(fango1, 0)

timeText = ttk.Label(root, textvariable=time_str, font=("Helvetica", 50))
time_str.set(sf2)
timeText.grid(row=0,column=1)

startButton = ttk.Button(root, text='Start', command=count_down)
startButton.grid(row=0,column=3)

quitButton = ttk.Button(root, text='Quit', command=exit)
quitButton.grid(row=0,column=6)

style = ttk.Style()
style.configure("bezeichnungen.TLabel", foreground="black", background="yellow", font=('Helvetica', 30))
bez_1 = ttk.Label(root, text='Fango 1', style="bezeichnungen.TLabel")
bez_1.grid(row=0,column=0)

#root.after_idle(count_down)
root.mainloop()
Zuletzt geändert von Anonymous am Montag 6. Juni 2016, 10:18, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 8796
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 6. Juni 2016, 07:12

@twinsen: was erwartest Du? Du hast eine for-Schleife, die unabhängig ob da ein Fenster offen ist oder nicht, weiterläuft. Du brauchst eine Funktion, die ohne for-Schleife funktioniert, und bei jedem Aufruf Deinen Zähler erhöht und danach per after sich selbst wieder aufruft. Dazu mußt Du die Laufvariable natürlich über das Ende der Funktion hinaus merken, was am besten funktioniert, wenn Du objektorientiert programmierst.

Vermeide *-importe, da Du nicht kontrollieren kannst, welche Namen da in den aktuellen Namensraum übernommen werden. Bei tk wird üblicherweise ein "import tkinter as tk" geschrieben und alle Zugriffe auf tk-Namen per "tk." referenziert, wie Du es ja bei ttk schon machst.
twinsen
User
Beiträge: 2
Registriert: Sonntag 5. Juni 2016, 22:18

Montag 6. Juni 2016, 15:43

Vielen Dank für die schnelle Hilfe und die Tipps, werd ich so umsetzen :wink:
Antworten