Seite 1 von 1

Sekündlich aktualisierter Text im Textfeld

Verfasst: Freitag 8. September 2017, 14:38
von Rudi93
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

Re: Sekündlich aktualisierter Text im Textfeld

Verfasst: Freitag 8. September 2017, 14:55
von Sirius3
@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.

Re: Sekündlich aktualisierter Text im Textfeld

Verfasst: Freitag 8. September 2017, 18:57
von snafu
@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...

Re: Sekündlich aktualisierter Text im Textfeld

Verfasst: Freitag 8. September 2017, 23:00
von Rudi93
@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: