label ändern zur laufzeit einer while / for schleife

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Ayahuasca
User
Beiträge: 7
Registriert: Montag 19. November 2018, 16:04

hallo,

ich habe einen counter erstellt den ich über einen button starte. nun läuft über einen print befehl in der console der counter einwandfrei, jedoch wird in meinem windowsfenster der wert erst nach ablauf meiner schleife aktualisiert. jeder versuch irgendwie zur laufzeit meiner schleife mein label zu ändern schlägt leider fehl. hat jemand eine idee dazu? danke

Code: Alles auswählen

def start_counting():
    global counter
    i = int(counter)
    while i > 0:
        i = i - 1
        counter_label.config(text=i)
        print(i)
        sleep(1)
        
Entschuldigung für manch "dumme" Fragen, bin absoluter Neuling, aber danke für jede hilfreiche Antwort aus der tollen Community hier!
__deets__
User
Beiträge: 14525
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und taeglich gruesst das Murmeltier.

Diese Frage wird hier andauernd gestellt, und andauernd beantwortet. Kannst du mal ein bisschen durch die Beitraege im tkinter-Forum stoebern? Der Suchbegriff ist "after".
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@Ayahuasca: in einer GUI darf es keine lang laufenden Funktionen geben, soetwas löst man bei tkinter mit after:

Code: Alles auswählen

def start_counting(counter_label, counter=100):
    counter -= 1
    counter_label['text'] = counter
    counter_label.after(1000, start_counting, counter_label, counter)
Ayahuasca
User
Beiträge: 7
Registriert: Montag 19. November 2018, 16:04

Vielen vielen Dank! Das hat mir weitergeholfen
Entschuldigung für manch "dumme" Fragen, bin absoluter Neuling, aber danke für jede hilfreiche Antwort aus der tollen Community hier!
Ayahuasca
User
Beiträge: 7
Registriert: Montag 19. November 2018, 16:04

Echt hart der Einstieg in die Programmierung. Jetzt hab ich das nächste Problem weil der Zähler sofort losrennt wenn ich das Programm starte, ich checks grad nicht weil ich den Button ja nicht gedrückt hab.

Hier mal der komplette Code: (evtl. sollt ich grad mal eine Pause machen, ich blick nicht durch)

Code: Alles auswählen

from tkinter import *
counter = 50
root = Tk()
headerBackground = "#353535"
headerFont = "white"
header_bg = "#555555"
root.geometry("480x320+0+0")
root.configure(bg=headerBackground)

try:
    with open("time_counter.txt", "r") as readingFile:
        counter = readingFile.read(counter)
        count = counter
        if counter == "":
            counter = 50
except:
    with open("time_counter.txt", "w") as writingFile:
        counter = writingFile.write("0")


# functions ----------------------------------------------------
def count_up():
    global counter
    if int(counter) < 99:
        counter = int(counter) + 1
        counter_label.config(text=counter)
        global file
        with open("time_counter.txt", "w") as file:
            file.write(str(counter))


def count_down():
    global counter
    if int(counter) > 0:
        counter = int(counter) - 1
        counter_label.config(text=counter)
        global file
        with open("time_counter.txt", "w") as file:
            file.write(str(counter))
    else:
        pass


def start_counting(counter_label, counter=100):
    counter -= 1
    counter_label['text'] = counter
    counter_label.after(1000, start_counting, counter_label, counter)


# items ------------------------------------------------------
header_label = Label(root, text="Timer")
counter_label = Label(root, text=counter, bg="yellow")
button_plus = Button(root, text="+", command=count_up)
button_minus = Button(root, text="-", command=count_down)
button_start = Button(root, text="Start", command=start_counting(counter_label, int(counter)))


# positioning ------------------------------------------------
header_label.place(x=20, y=20, width=440, height=50)
counter_label.place(x=20, y=90, width=200, height=100)
button_plus.place(x=20, y=200, width=100, height=50)
button_minus.place(x=120, y=200, width=100, height=50)
button_start.place(x=20, y=250, width=200, height=50)


root.mainloop()
Entschuldigung für manch "dumme" Fragen, bin absoluter Neuling, aber danke für jede hilfreiche Antwort aus der tollen Community hier!
__deets__
User
Beiträge: 14525
Registriert: Mittwoch 14. Oktober 2015, 14:29

Uuuuund das zweite Murmeltier erhebt sein haessliches Haupt ;)

Du rufst start_couning doch sofort auf. Das Argument an command muss ein *callable* sein, also etwas, das aufrufbar ist. Ein Weg das zu erreichen ist ein lambda:

lambda: start_counting(counter_label)
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ayahuasca hat geschrieben: Freitag 7. Dezember 2018, 16:22 Echt hart der Einstieg in die Programmierung.
Klar, wenn man direkt mit GUI-Programmierung einsteigt. Normalerweise sollte man sich erstmal mit Python an sich vertraut machen. Später kann man sich dann die Bibliotheken anschauen, die man interessant findet. Sonst ist das kein gutes Programmieren, sondern das zusammenhacken von Codeschnipseln, die man hier und da mal aufschnappt.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@Ayahuasca: da ist so vieles falsch an dem Code. Du rätst hier Zeugs zusammen, ohne zu wissen, was passiert. Mach kleinere Schritte, probier jede Zeile aus, bis Du verstanden hast, was passiert.
Ein paar Sachen, die Du sofort angewöhnen solltest, weil sie nur zu Problemen führen: keine *-Importe, kein `global`, keine nackten `except`. Statt dessen `import tkinter as tk`, Funktionen bekommen alles was sie brauchen über ihre Argumente und geben das Ergebnis per `return` zurück. Exceptions so konkret wie möglich, also hier IOError.
Variablen sollten immer den Typ haben, mit dem man arbeiten will, also `counter` ist immer ein `int`, und wird nicht erst beim Benutzen umgewandelt. Ein `else: pass` ist unsinnig. Aller Ausführbarer Code auf oberster Ebene gehört auch in eine Funktion.
Antworten