.after() Zeitauswertung

Fragen zu Tkinter.
Antworten
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

Hallo,
ich versuche mich mal wieder an der Zeitauswertung einer Funktion in Verbindung mit Tkinter.
Den Code habe ich aus dem Netz, es wird ein Fenster geöffnet, es erscheint eine grüne Zahl die alle 0,5 Sekunden im 1 erhöht wird.
Ich möchte die Zeit stoppen, die die Funktion zum ausführen braucht. Inklusive den 0,5 Sekunden Wartezeit der after()-Funtkion.
Hier ist der Code:

Code: Alles auswählen

import tkinter as tk
import time as time

counter = 0 
def counter_label(label, x):
  def count():
    global counter
    counter += 1
    label.config(text=str(counter))
    end_t = time.time()
    label.after(int(x), count)
    start_t = time.time()
    print(end_t - start_t)
  count()
 
root = tk.Tk()
root.title("Counting Seconds")

label = tk.Label(root, fg="green")
label.pack()

counter_label(label,500)

button = tk.Button(root, text='Stop', width=25, command=root.destroy)
button.pack()
root.mainloop()
Leider erscheint in der Konsole immer 0.0.
Ich habe es auch schon so probiert:

Code: Alles auswählen

def counter_label(label, x):
  def count():
    start_t = time.time()
    global counter
    counter += 1
    label.config(text=str(counter))
    label.after(int(x), count)
    end_t = time.time()
    print(end_t - start_t)
  count()
Auch hier bekomme ich immer nur 0.0 ausgegeben.
Ist es möglich die Zeit so zu stoppen, mit den 0,5 Sekunden Wartezeit ?

Gruß Kai
Sirius3
User
Beiträge: 18289
Registriert: Sonntag 21. Oktober 2012, 17:20

Du verstehst hier etwas falsch. `after` wartet nicht, sondern sagt der Ereignisschleife nur, dass die Funktion nach einer Zeitspanne wieder gestartet werden soll.
Du mußt Dir die Zeit von einem Aufruf bis zum nächsten Aufruf merken.
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

Hallo Sirius3,
vielen Dank für deine Antwort ! Das wusste ich wirklich nicht, danke für den Tipp !!
So klappt es :)

Code: Alles auswählen

import tkinter as tk
import time as time

counter = 0 
count_array = []

def counter_label(label, x):
    def count():
        count_array.append(time.time()) 
        global counter
        if counter > 1:
            print(-1*(count_array[counter-1]-count_array[counter]))
        counter += 1
        label.config(text=str(counter))
        label.after(int(x), count)
    count() 
 
root = tk.Tk()
root.title("Counting Seconds")

label = tk.Label(root, fg="green")
label.pack()

counter_label(label,500)

button = tk.Button(root, text='Stop', width=25, command=root.destroy)
button.pack()
root.mainloop()
Sirius3
User
Beiträge: 18289
Registriert: Sonntag 21. Oktober 2012, 17:20

as bei import ist zum Umbenennen da, `time` wird aber gar nicht umbenannt, das `as` also unsinnig.
Benutze keine globalen Variablen und kein global. counter wird auch ga nicht gebraucht, da es identisch ist mit der Länger der Liste `count_array`. Was uns gleich zur Namensgebung bringt: count_array ist kein Array sondern eine Liste. Typen haben in Variablennamen nichts verloren, und in Wirklichkeit werden da ja keine counts gespeichert, sondern Zeiten.
Wenn man die Zahlen in der richtigen Reihenfolge abzieht, braucht man kein * -1.

Code: Alles auswählen

import tkinter as tk
import time

def start_counter(label, delay):
    times = []
    def count():
        times.append(time.time())
        if len(times) > 2:
            print(times[-1] - times[-2])
        label.config(text=str(len(times)))
        label.after(delay, count)
    count()

def main():
    root = tk.Tk()
    root.title("Counting Seconds")

    label = tk.Label(root, fg="green")
    label.pack()
    start_counter(label, 500)

    tk.Button(root, text='Stop', width=25, command=root.destroy).pack()
    root.mainloop()

if __name__ == '__main__':
    main()
Wie Du siehst, ist die Zeit zwischen den Aufrufen größer als 0.5 Sekunden. Das muß man also korrigieren, wenn man exakt 0.5s will.
Antworten