Sekündlich aktualisierter Text im Textfeld

Fragen zu Tkinter.
Antworten
Rudi93
User
Beiträge: 2
Registriert: Freitag 8. September 2017, 11:57

Hallo liebe Python-Community,

Ich habe folgendes Problem: Ich habe eine Variable "a" und eine vordefinierte Variable "b". Ich möchte dass "a" die Zahlen von 0 bis "b" durchläuft. Für jede Zahl die "a" durchläuft soll abwechselnd erst ein "O", dann ein "X" und dann wieder ein "O" im Textfeld ausgegeben werden. (Also bei Sekunde 1: O, bei Sekunde 2: OX, bei Sekunde 3: OXO usw.) Die report() Methode wird durch das Betätigen eines Buttons gestartet.
Ausschnitt aus meinem Code:

Code: Alles auswählen

def report(self):
        self.text.delete(0.0, END)
        a = 0
        b = int(self.b.get())
        x = 1
        while a != b:
            if x%2 == 0:
                self.text.insert(0.0, 'O')
            else:
                self.text.insert(0.0, 'X')
            x = x + 1
            time.sleep(1)
            zeit = zeit + 1
Jedoch wird nicht wie gewünscht jede Sekunde ein Zeichen der Zeichenkette hinzugefügt, sondern wenn Beispielsweise b=4 ist, wird nach 4 Sekunden die Zeichenkette "OXOX" im Textfeld angezeigt.
Wie bekomme ich hin, dass er im Sekundentakt abwechselnd die Zeichen hinzufügt? :-)

Dankeschön & liebe Grüße,
Rudi
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@Rudi93: GUI-Methoden dürfen niemals lange dauern, weil sonst alles einfriert. Du mußt eine Funktion schreiben, die periodisch jede Sekunde einmal mit self.after aufgerufen wird und jeweils das nächste X oder O ausgibt.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Rudi93:
Ein self.text.insert() führt nicht automatisch dazu, dass der Inhalt deines Textwidgets unmittelbar aktualisiert wird. Möglicherweise kannst du dies mit einem API-Aufruf zum Neuzeichnen erzwingen (kenne mich mit TKinter nicht aus). Besser ist aber, wie vorgeschlagen, die Nutzung der after()-Methode, anstatt allzu sehr in die internen Zeichenvorgänge einzugreifen. Falls du nicht weißt, wie du das mit after() konkret umsetzen kannst, dann helfen wir dir natürlich dabei...
Rudi93
User
Beiträge: 2
Registriert: Freitag 8. September 2017, 11:57

@Sirius3
@snafu
Vielen Dank für die Antworten. Ich habe mir die self.after Funktion erfolgreich ergoogelt und hoffe mit den gefundenen Beispielen meinen Code am Montag zu korrigieren.
Falls ich nicht klar komme wende ich mich gerne nochmal ans Forum.
Bis dahin noch ein schönes Wochenende euch. :mrgreen:
Antworten