tkinter stoppuhr funktioniert nicht

Fragen zu Tkinter.
Antworten
Krypton514
User
Beiträge: 15
Registriert: Samstag 23. Juli 2016, 12:24

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!
Zuletzt geändert von Anonymous am Freitag 19. August 2016, 11:55, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Liebe Grüße,
Krypton514 :mrgreen:
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.
Krypton514
User
Beiträge: 15
Registriert: Samstag 23. Juli 2016, 12:24

Oh, ich sollte doch noch genauer schauen! :D Danke und das mit global werde ich auch versuchen nicht mehr zu verwenden!
Liebe Grüße,
Krypton514 :mrgreen:
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()
Benutzeravatar
snafu
User
Beiträge: 6736
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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``.
Krypton514
User
Beiträge: 15
Registriert: Samstag 23. Juli 2016, 12:24

@all: Danke, dass ihr mir so viel helft. Ich lerne hier im Forum mehr als wo anders!
Liebe Grüße,
Krypton514 :mrgreen:
Antworten