Seite 1 von 1

warten

Verfasst: Sonntag 16. Februar 2003, 21:40
von Tux
Hi @ll!

Ich programmiere mit Tkinter!
Vereinfacht:
Ich habe einen Button! Sobald man auf diesen Button klickt, soll das Programm in ein Label erstellen und den darin befindenden Text anzeigen! Nach 5 Sekunden soll dieses Label wieder verschwinden! Wie geht das????

Danke schon mal

Hier mal mein Versuch, der nicht funktioniert hat:

Code: Alles auswählen

from time import *
import Tkinter
from Tkconstants import *
tk=Tkinter.Tk()
frame=Tkinter.Frame(tk)
frame.pack()
def ok():
        frame2=Tkinter.Frame(tk)
        frame2.pack()
        label=Tkinter.Label(frame2,text="TEXT")
        label.grid(row=1,column=1)
        sleep(5)
        frame2.destroy()
button=Tkinter.Button(frame,text="OK",command=ok)
button.grid(row=1,column=1)
button2=Tkinter.Button(frame,text="Beenden",command=tk.destroy)
button2.grid(row=1,column=1)
Hier passiert aber folgendes:
Ich klicke - warte 5 Sekunden - nichts sichtbares passiert weiter

Re: warten

Verfasst: Sonntag 16. Februar 2003, 22:54
von Voges
Hallo!
Pack' vor das sleep(5) noch ein tk.update_idletasks(). Das sorgt dafür, dass die noch anstehenden Events (u.a. die Events für's Neuzeichnen von Widgets) unmittelbar abgearbeitet werden. Die Methode ist immer empfehlenswert, wenn zeitraubende Aktionen anstehen.
Nur am Rande: Gefühlsmäßig würde ich in Tkinter-Programmen tk.after(5000) dem sleep(5) vorziehen. Aber einen Unterschied macht es AFAIK nicht.
Jan

Unterschied!

Verfasst: Montag 17. Februar 2003, 00:41
von Mickey
Der Unterschied ist gewaltig. Während die Sleep-Version den Thread blockiert -- und damit das GUI -- kann das GUI in der after-Version ordentlich weiterarbeiten.

Re: Unterschied!

Verfasst: Montag 17. Februar 2003, 08:24
von Voges
Hm, unter http://effbot.org/books/tkinterbook/widget.htm fand ich Folgendes:
after(delay_ms). ... Note that in the current version, this also blocks the event loop. In practice, this means that you might as well do: time.sleep(delay_ms*0.001)
Da werde ich mal ein wenig rumexperimentieren.
Jan

Re: Unterschied!

Verfasst: Montag 17. Februar 2003, 09:45
von Voges
Hallo Tux!

Ersetze mal
tk.update_idletasks()
sleep(5)
frame2.destroy()

durch
tk.after(5000,lambda f=frame2: f.destroy())

Dann kannst Du "Ok" auch mehrmals schnell hintereinander drücken. Recht spaßig ;-). Ich nehme mal an, dass Mickey bei seiner Bemerkung after() mit Callback-Funktion im Sinne hatte.

Jan

Danke

Verfasst: Dienstag 18. Februar 2003, 23:07
von Tux
DANKE an Voges & Mickey - ihr habt mir sehr geholfen!