Seite 1 von 1

Zahlen einer Schleife grafisch ausgeben

Verfasst: Dienstag 31. Juli 2007, 14:18
von fidibus
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()

Verfasst: Dienstag 31. Juli 2007, 15:23
von BlackJack
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()

Verfasst: Samstag 4. August 2007, 09:25
von schlangenbeschwörer
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...

Verfasst: Dienstag 28. August 2007, 13:37
von Robin
Super, der Schlangenbeschwörer hat mich auf den richtigen Weg gebracht, VIELEN DANK!