warten

Fragen zu Tkinter.
Antworten
Tux
User
Beiträge: 70
Registriert: Freitag 8. November 2002, 23:07
Kontaktdaten:

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
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

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
Mickey
User
Beiträge: 22
Registriert: Donnerstag 29. August 2002, 00:34
Wohnort: Frankfurt am Main
Kontaktdaten:

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.
Gruß,

:M:
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

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
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

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
Tux
User
Beiträge: 70
Registriert: Freitag 8. November 2002, 23:07
Kontaktdaten:

DANKE an Voges & Mickey - ihr habt mir sehr geholfen!
Antworten