Inhalt:
Das Problem
Die letzte Zeile, die in Tk-Scripten ausgeführt wird ist in der Regel die Zeile in der
MainLoop?; steht. Dennoch möchte man manchmal, daß danach noch Code ausgeführt wird, sei es nach einer bestimmten Zeit, in einer Endlosschleife oder nach einem bestimmten Ereignis. Für diese drei Probleme gibt es auch drei Lösungen.
Lösung 1: Nach einer bestimmten Zeit
Das einfachste ist es, wenn der Code nach einer bestimmten Zeit ausgeführt wird. Dazu muß einfach folgender Code notiert werden:
Code Sample:
$widget->after(4000=>sub {print "4 Sekunden vergangen\n"});
# oder
$widget->after(4000=>\&routine);
wobei $widget eine beliebiges widget darstellen kann. Der Code wird (in diesem Fall) 4000 Millisekunden, das heißt 4 Sekunden nach aufruf von after ausgeführt. Anstelle als sog. Callback ein sub {...} anzugeben, kann auch der Name einer Subroutine (auch einer eigenen) angegeben werden, jedoch mit einem \& davor. Der Leserlichkeit halber ist die erste Methode bei sehr kurzen (bis etwa 2 Befehle) vorzuziehen. Sobald allerdings auf diese Weise mehrere Befehle ausgeführt werden, sollte man eine subroutine definieren, die dann über die zweite Methode aufgerufen wird.
Es können beliebig viele after-Sequenzen aufgerufen werden, sie werden alle zur entsprechenden Zeit ausgeführt.
Es ist auch möglich, eine Subroutine ausführen zu lassen, sobald sich das Tk-System "beruhigt" hat und nichts mehr zu tun hat. Dazu
verwendet man afterIdle:
$widget->afterIdle(sub { ... });
Lösung 2: In einer Endlosschleife
Um Code in einer Endlosschleife auszuführen, die gleichzeitig mit
MainLoop? läuft, muß man lediglich folgende Zeilen notieren
Code Sample:
$widget->repeat(4000=>sub {print "wieder 4 Sekunden vergangen\n"});
# oder
$widget->repeat(4000=>\&routine);
und schon wird alle 4 Sekunden der notierte Code ausgeführt. Ansonsten sind die Regeln ähnlich wie beim after-Befehl.
Ebenso können auch mehrere (beliebig viele) repeats definiert werden, daß Tk-Modul kümmert sich intern darum, daß alle zur passenden Zeit ausgeführt werden.
Lösung 3: Nach einem bestimmten Ereignis
Um einen Code bei einem Spezifischen Ereignis auszuführen ist der Syntax wiederum sehr ähnlich zu den beiden vorhergegangenen Aufgaben:
Code Sample:
$widget->bind('<a>'=>sub {print "Taste 'a' wurde gedrückt vergangen\n"});
# oder
$widget->bind('<a>'=>\&routine);
In diesem Fall wird der Code nach betätigen der Taste 'a' ausgeführt. Wird diese Taste erneut betätigt, so wird der Code erneut ausgeführt. Allerdings erforderd der bind-Befehl, daß das zu der Variablen gehörende Element den Focus hat. Wird auf diese Taste ein anderer bind auf die gleiche Taste definiert, so wird der alte bind aufgehoben.
Auch hier gilt wieder, daß beliebig viele binds gleichzeitig nebenher exestieren können.
Ergänzungen, Kommentare
Kommentare werden am besten in folgender Form vorgenommen, damit
sie im Inhaltsverzeichnis angezeigt werden:
---+++ Main.??? - 14 Jul 2003 - Betreff
--
JoergWestphal - 11 Aug 2003