Seite 1 von 1

Darstellung erst nach Beenden der Funktion textchange(self)

Verfasst: Mittwoch 16. November 2016, 20:18
von superthorsten1
Ich habe das Problem, dass das Label erst am Schluss von textchange(self) angezeigt wird. Ich möchte aber, dass die zwei Einträge „Hallo“ und „Welt“ nacheinander angezeigt werden.

Folgender Code:

Code: Alles auswählen

import Tkinter as tk
from time import sleep

class ExampleApp(tk.Tk):
	def __init__(self):
		tk.Tk.__init__(self)
		self.label = tk.Label(self, text="", width=10)
		self.label.pack()
		self.textchange()
	def textchange(self):
		self.label.configure(text="Hallo")
		sleep( 2 )
		self.label.configure(text="Welt")

if __name__ == "__main__":
	app = ExampleApp()
	app.mainloop()
Besten Dank an Euch,
Thorsten

Re: Darstellung erst nach Beenden der Funktion textchange(self)

Verfasst: Mittwoch 16. November 2016, 20:35
von Sirius3
@superthorsten1: bei eventgesteuerten Oberflächen dürfen Methoden nur sehr kurz laufen, sonst friert die Anwendung ein. Dafür gibt es after, um nach einer bestimmten Zeit eine Anweisung auszuführen:

Code: Alles auswählen

class ExampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.label = tk.Label(self, text="", width=10)
        self.label.pack()
        self.textchange("Hallo", "grosse", "Welt")
    def textchange(self, first, *other):
        self.label.configure(text=first)
        if other:
            self.after(2000, self.textchange, *other)
Übrigens wird mit 4 Leerzeichen pro Ebene eingerückt.

Re: Darstellung erst nach Beenden der Funktion textchange(self)

Verfasst: Donnerstag 17. November 2016, 17:36
von superthorsten1
Vielen Dank, das funktioniert. Es friert also ein im Sinne von es hängt sich auf? Ich dachte das ginge mit meinem Beispiel nicht, weil Werte erst nach Abschluss der Funktion übergeben werden. Naja, ich schaue mir das mit after und other mal genauer an.

Re: Darstellung erst nach Beenden der Funktion textchange(self)

Verfasst: Donnerstag 17. November 2016, 18:40
von BlackJack
@superthorsten1: Aufhängen wäre ja eher wenn es beständig einfriert, also gar nicht weiter geht. Bei Dir friert es wegen dem `sleep()` nur für etwas mehr als die zwei Sekunden ein. Du änderst in der Methode nur die Daten. Die Anzeige wird erst aktualisiert wenn die Methode fertig ist und zur Tk-Hauptschleife zurückkehrt, die dann unter anderem die Anzeige aktualisiert.