Ich ändere in einer Schleife die Anzeige, sehe aber nur die letzte Änderung. Warum?

Inhalt:

Immer wieder taucht die Frage auf, warum man nur die letzte Änderung im Fenster sieht. Das muss wohl ein Bug in Tk sein, oder? Nein, ist es nicht.

Ishka hat es schön erklärt warum das so ist: Tk arbeitet die Sachen sequentiell (also nacheinander) und nicht parallel ab. Wenn ein Widget (oder ein Text) geändert wird, dann wird es nicht gleichzeitig (parallel) im Fenster geändert.

So funktioniert es nicht:

#!/usr/bin/perl

use strict;
use warnings;
use Tk;

my $text = 'Hallo';
my $mw = tkinit();
my $entry = $mw->Entry(-textvariable => \$text)->pack();
$mw->Button(-command => \&change_text, -text => 'Drueck mich')->pack();

MainLoop;

sub change_text{
    for(qw(Dies ist ein neuer Text)){
        $text = $_;
        sleep(1);
    }
}

Nachdem man den Button klickt, wartet man 5 Sekunden und dann wird erst das Wort "Text" im Entry angezeigt. Das ist ja nicht was wir haben wollen.

So funktionierts:

#!/usr/bin/perl

use strict;
use warnings;
use Tk;

my $text = 'Hallo';
my $mw = tkinit();
my $entry = $mw->Entry(-textvariable => \$text)->pack();
$mw->Button(-command => \&change_text, -text => 'Drueck mich')->pack();

MainLoop;

sub change_text{
    for(qw(Dies ist ein neuer Text)){
        $text = $_;
        $mw->update();
        sleep(1);
    }
}

Aufgefallen wo der Unterschied ist? Ich habe einfach noch eine Zeile $mw->update(); eingefügt. Damit wird die Anzeige der Widgets aktualisiert und somit wird dann auch jedes Wort für eine Sekunde angezeigt!

Ergänzungen, Kommentare

Kommentare werden am besten in folgender Form vorgenommen, damit sie im Inhaltsverzeichnis angezeigt werden (natürlich ohne das <verbatim>):
---+++ Main.??? - 14 Jul 2003 - Betreff

UtilFaqSubForm edit

Titel Ich ändere in einer Schleife die Anzeige, sehe aber nur die letzte Änderung. Warum?
Autor ReneeBaecker
Bereich FaqTK
Topic revision: 2006-06-01, ReneeBaecker
 
Bitte die NutzungsBedingungen beachten.
Bei Vorschlägen, Anfragen oder Problemen mit dem PerlCommunityWiki bitten wir um WebBottomBarExample">Rückmeldung.