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