warten

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

warten

Beitragvon Tux » Sonntag 16. Februar 2003, 21:40

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

Re: warten

Beitragvon Voges » Sonntag 16. Februar 2003, 22:54

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

Unterschied!

Beitragvon Mickey » Montag 17. Februar 2003, 00:41

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

Re: Unterschied!

Beitragvon Voges » Montag 17. Februar 2003, 08:24

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

Re: Unterschied!

Beitragvon Voges » Montag 17. Februar 2003, 09:45

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

Danke

Beitragvon Tux » Dienstag 18. Februar 2003, 23:07

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder