Frage zu time.sleep()

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
raiminator
User
Beiträge: 31
Registriert: Dienstag 1. Mai 2012, 08:06

Abend,

ich hätte da mal eine Frage zu time.sleep()
Ein Button (Tkinter) soll grün eingefärbt werden und danach soll 2 Sekunden gewartet werden. Das Einfärben geschieht aber erst nach den 2 Sekunden.

Der Code an der Stelle:

Code: Alles auswählen

setgreen()
time.sleep(2)
...
Wundert mich ziemlich weil der Funktionsaufruf von setGreen() vor dem von time.sleep() ist.

Schonmal danke für Hilfe,
Grüße raiminator
deets

So funktionieren GUIs nicht. Aenderungen im Aussehen werden immer erst bei erreichen des main-loop durchgefuehrt. Deshalb muss man mit Timern arbeiten. Da du nicht verraetst, welches GUI-Framework du benutzt (kleiner Hinweis... es gibt fuer die diversen spezielle Unterforen) kann man dir da auch nicht detaillierter helfen.
raiminator
User
Beiträge: 31
Registriert: Dienstag 1. Mai 2012, 08:06

dass es die Unterforen gibt weiß ich, ich dachte nur das hätte jetzt mehr mit dem time.sleep zu tun.
Außerdem habe ich geschrieben dass ich Tkinter benutze ;)
Die mainloop wurde auch schon erreicht, das ganze steht in einer Funktion drin die von einem Button aufgerufen wird.
deets

Ah, verzeih, dann habe ich nicht genau genug gelesen. Die Funktion die du suchst ist "after". Damit startest du den Code der nach den 2 Sekunden ausgefuehrt werden soll.

Und wie denkst du soll denn der mainloop erreicht werden, wenn sleep wartet?
BlackJack

@raiminator: Die Hauptschleife wertet die Benutzerinteraktion aus und ruft Deine Funktion auf wenn die Schaltfläche gedrückt wurde. Und so lange Deine Funktion läuft, und nicht wieder zur aufrufenden Hauptschleife zurück kehrt, kann die Hauptschleife natürlich auch nichts tun.
raiminator
User
Beiträge: 31
Registriert: Dienstag 1. Mai 2012, 08:06

Entweder versteh ich dich falsch oder du mich :D
Die Mainloop wurde bei mir schon lange aufgerufen, und das mit dem sleep steht in einer Funktion die bei Klick auf einen Button aufgerufen wird.
Habe es jetzt mal mit main.after(2000, neueFrage()) versucht, aber das gibt das gleiche Ergebnis :/
deets

Du verstehst falsch.

Der mainloop muss nicht nur *einmal* aufgerufen werden. Ein GUI-Programm befindet sich quasi bestaendig darin, und wenn events kommen - wie Button-druecken oder eben Timer-Events - dann wird code ausgefuehrt. Aber solange der ausgefuehrt wird (und sleep ist ausfuehren..) passiert nix mit der GUI.

Und dein gezeigter call ist auch falsch. Du musst natuerlich neueFrage nicht *AUFRUFEN*, sondern uebergeben:

main.after(2000, neueFrage)

Beachte die fehlenden Klammern.
raiminator
User
Beiträge: 31
Registriert: Dienstag 1. Mai 2012, 08:06

aah, danke, jetzt klappt's endlich!
Antworten