Zeitschleife

Fragen zu Tkinter.
Antworten
TengTeng
User
Beiträge: 5
Registriert: Donnerstag 26. Mai 2016, 21:15

Donnerstag 26. Mai 2016, 21:31

Moin moin,

ich bin gerade erst in Python eingestiegenund habe mich ein wenig in Tkinter eingearbeitet :D
Und habe nun folgendes Problem:

Ich möchte eine Schleife bauen die nacheinander Punkte ausgibt.
Wie bei oft auch bei Ladebildschirmen.
Nach dem in dem Textfeld die Meldung "Kalbfleisch wird geschnitten" kommt,
soll nun im Sekundentakt (ungefähr) ein weiterer Punkt erscheinen.
Also dann am Ende "Kalbfleisch wird geschnitten..."

Mein Problem ist aber das die Punkte erst angezeigt werden wenn die Schleife beendet ist.
Wenn man das gleich in der Konsole laufen läst, funktioniert das super, aber halt nicht mit dem Textfeld :(

Habt ihr eine Idee woran das liegt?

Code: Alles auswählen

def start():
   		 text_ausgabe.tag_config("r", foreground="red")
  		  if var.get() == 1:
     		 	text_ausgabe.insert("end", "Kalbfleisch wird geschnitten")
      			 x = 0
        		  while x < 4:
            			text_ausgabe.insert("end",".")
            			time.sleep(2)
            			x += 1
        
PS: Benutze Python 3.5.1 falls das was zur Sache tut....
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Donnerstag 26. Mai 2016, 22:44

Die GUI hat eine interne Schleife die alles updated, diese Schleife kümmert sich auch um das Anzeigen deiner Punkte. Dein `time.sleep` pausiert die interne Schleife, deshalb wird dir nicht angezeigt (wie du evt gemerkt hast friert auch das Fenster auch ein).

Du kannst `w.after` benutzen um in X ms eine Funktion aufzurufen ohne die interne Schleife zu pausieren (ungetestet):

Code: Alles auswählen

def add_points(widget, n, delay, _current=0):
    widget.insert("end", ".")

    if _current < n:
        widget.after(delay, add_point, widget, n, delay, _current + 1)


def start():
    text_ausgabe.tag_config("r", foreground="red")

    if var.get() == 1:
        text_ausgabe.insert("end", "Kalbfleisch wird geschnitten")

        add_points(text_ausgabe, 4, 2000)
`add_points` fügt die Punkte hinzu und ruft sich n-mal selber mit einem delay auf um wieder einen Punkt hinzuzufügen, im Argument `_current` merkt sich die Funktion wie oft sie schon aufgerufen wurde.
the more they change the more they stay the same
TengTeng
User
Beiträge: 5
Registriert: Donnerstag 26. Mai 2016, 21:15

Freitag 27. Mai 2016, 06:30

Vielen vielen Dank!
Funktioniert einwandfrei!
Antworten