Seite 1 von 1

tkinter stoppuhr funktioniert nicht

Verfasst: Freitag 19. August 2016, 11:38
von Krypton514
Ich habe gerade eine Stoppuhr in tkinter Programmiert und eine Funktion erstellt. Am Ende des Programmes sollte es die Funktion ausführen, doch stattdessen kommt eine Fehler Meldung:
Traceback (most recent call last):
File "/home/giorgio/Desktop/Python/stoppuhr.py", line 17, in <module>
counter_label(label)
NameError: name 'counter_label' is not defined
Sollte es nicht die 'Funktion ausführen und wenn nicht, was habe ich falsch gemacht?
Hier ist der Code den ich geschrieben habe:

Code: Alles auswählen

import tkinter as tk

counter = 0

def couter_label(label):
    def count():
        global counter
        counter += 1
        label.config(text=str(counter))
        label.after(1000, count)
    count()

root = tk.Tk()
root.title("Counting Seconds")
label = tk.Label(root, fg="green")
label.pack()
counter_label(label)
button = tk.Button(root, text='Stop', width=25, comand=root.destroy)
button.pack()
root.mainloop()
In der 4 letzten Zeile schreibe ich counter_label(label) um die Funktion von der 5 Zeile auszuführen.
Vielen Dank im vorhinein!

Re: tkinter stoppuhr funktioniert nicht

Verfasst: Freitag 19. August 2016, 11:56
von BlackJack
Die Funktion in Zeile 5 heisst aber anders. Schau noch mal genau hin.

Edit: Und dann vergiss bitte ganz schnell, dass es ``global`` überhaupt gibt. Vor GUIs sollte man objektorientierte Programmierung lernen und sich keine Krücken mit globalen Variablen basteln.

Re: tkinter stoppuhr funktioniert nicht

Verfasst: Freitag 19. August 2016, 12:04
von Krypton514
Oh, ich sollte doch noch genauer schauen! :D Danke und das mit global werde ich auch versuchen nicht mehr zu verwenden!

Re: tkinter stoppuhr funktioniert nicht

Verfasst: Freitag 19. August 2016, 12:19
von BlackJack
@Krypton514: Noch ein paar Anmerkungen: `counter_label()` ist kein guter Name für eine Funktion. Funktionen (und Methoden) werden üblicherweise nach Tätigkeiten benannt, denn die *tun* etwas, und man kann sie dann leichter von eher passiven Werten unterscheiden.

Hier braucht man noch nicht zwingend objektorientierte Programmierung (OOP) um das ``global`` zu vermeiden, weil man bei `after()` auch Argumente für an die Rückruffunktion durchreichen kann. Also zum Beispiel den aktuellen Sekundenzählerstand.

`destroy()` ist ziemlich hart, wo man doch eigentlich nur die GUI-Hauptschleife abbrechen möchte. Ungetestet:

Code: Alles auswählen

import tkinter as tk
 
 
def start_counting(label):
    def update(seconds):
        label['text'] = str(seconds)
        label.after(1000, update, seconds + 1)
    update(0)


def main():
    root = tk.Tk()
    root.title('Counting Seconds')
    label = tk.Label(root, foreground='darkgreen')
    label.pack()
    start_counting(label)
    tk.Button(root, text='Stop', width=25, command=root.quit).pack()
    root.mainloop()


if __name__ == '__main__':
    main()

Re: tkinter stoppuhr funktioniert nicht

Verfasst: Freitag 19. August 2016, 13:34
von snafu
Zum Hochzählen der Sekunden würde ich ja zu Beginn einen Referenzwert mittels time.monotonic() ermitteln. Die vergangenen Sekunden spiegeln dann die Zeit wider, die seit diesem Referenzwert vergangen ist. Wenn der Referenzwert mit `start` benannt ist, dann also ``elapsed = time.monotonic() - start``.

Re: tkinter stoppuhr funktioniert nicht

Verfasst: Freitag 19. August 2016, 18:17
von Krypton514
@all: Danke, dass ihr mir so viel helft. Ich lerne hier im Forum mehr als wo anders!