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

UtilFaqSubForm edit

Titel Wie führe ich Code nach Mainloop aus?
Autor Ishka
Bereich FaqTK
Topic revision: 2006-05-06, TinaMueller
 
Bitte die NutzungsBedingungen beachten.
Bei Vorschlägen, Anfragen oder Problemen mit dem PerlCommunityWiki bitten wir um WebBottomBarExample">Rückmeldung.