Darstellung erst nach Beenden der Funktion textchange(self)

Fragen zu Tkinter.
Antworten
superthorsten1
User
Beiträge: 6
Registriert: Mittwoch 16. November 2016, 20:08

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
Zuletzt geändert von Anonymous am Mittwoch 16. November 2016, 21:42, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
superthorsten1
User
Beiträge: 6
Registriert: Mittwoch 16. November 2016, 20:08

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.
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.
Antworten