Zahlen einer Schleife grafisch ausgeben

Fragen zu Tkinter.
fidibus
User
Beiträge: 1
Registriert: Dienstag 31. Juli 2007, 10:31

Zahlen einer Schleife grafisch ausgeben

Beitragvon fidibus » Dienstag 31. Juli 2007, 14:18

Hallo Fython.Forum,

wie kann ich grafisch Zahlen einer Schleife alle 1s ausgeben?
In meinem Beispiel bleibt die Anzeige bei "1" stehen.
Kann mir jemand helfen?

Gruß fidibus

Code: Alles auswählen

from time import *
from Tkinter import *
import sys
def beenden():
     print "!!!"     
     sys.exit(-1)

x=0
root = Tk()
t1=time()
while time()-t1<1:
     
     button = Button(root,text="Beenden",command=beenden)
     x=x+1
     label = Label (root, text=str(x))
     t1=time()
     t2=time()
     x=x+1
     while t2-t1<1:
         t2=time()
     label.pack()
     button.pack()
root.mainloop()
BlackJack

Beitragvon BlackJack » Dienstag 31. Juli 2007, 15:23

Das kann so nicht funktionieren. Glücklicherweise bricht die ``while``-Schleife nach dem ersten Durchgang schon ab, sonst würde man nicht einmal die 1 sehen. Die GUI "läuft" erst, wenn man in der Hauptschleife des GUI-Toolkits steckt, also wenn `mainloop()` aufgerufen wird.

Das aktualisieren des Zählers muss also nebenher passieren. Das kann man zum Beispiel über die `after()`-Methode von `Tkinter`-Widgets lösen. Dort kann man eine Verzögerung in Millisekunden angeben und eine Funktion die nach dieser Zeit aufgerufen werden soll.

Code: Alles auswählen

import Tkinter as tk
from itertools import count


def start_counter(label):
    counter = count(1)
    def update_func():
        label.config(text=str(counter.next()))
        label.after(1000, update_func)
    update_func()


def main():
    root = tk.Tk()
    label = tk.Label(root)
    label.pack()
    start_counter(label)
    button = tk.Button(root, text='Beenden', command=root.quit)
    button.pack()
    root.mainloop()


if __name__ == '__main__':
    main()
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Beitragvon schlangenbeschwörer » Samstag 4. August 2007, 09:25

Man kann's natürlich auch mit threads machen! :D

Code: Alles auswählen

import Tkinter as tk
import time
import thread
def counter():
    i = 1
    while 1:
        countvar.set(str(i))
        i += 1
        time.sleep(1)
root = tk.Tk()
countvar = tk.StringVar()
label = tk.Label(root, textvariable = countvar, font = ("Comic Sans MS", 20))
label.pack()
thread.start_new_thread(counter, ())
root.mainloop()

lustig wirds, wenn man sleep weglässt...dann ist der thread nämmisch schneller als tk...
Benutzeravatar
Robin
User
Beiträge: 50
Registriert: Dienstag 26. Juni 2007, 10:47

Beitragvon Robin » Dienstag 28. August 2007, 13:37

Super, der Schlangenbeschwörer hat mich auf den richtigen Weg gebracht, VIELEN DANK!

Wer ist online?

Mitglieder in diesem Forum: Google [Bot]