Hoe werkt dit programma nu? Let wel, ik ga hier niet Perl
en Tk uitleggen, voor alle functies in Perl en in Tk wordt uitgebreide help
geleverd. Wel probeer ik uit te leggen hoe die functies hier worden
gecombineerd tot een werkend programma, als startpunt voor meer complexe
programma's.
Laten we het eens stap voor stap bekijken. De file 'turtle.pl' (te vinden
in de zipfile op de Turtle page) bevat drie gedeelten:
- de opzet van het scherm met de layout van de knoppenbalk (in deze
pagina uitgelegd)
- het tekstwindow voor de commando's, met de routines voor de acties om
deze tekst uit te voeren (die aan de knoppen gekoppeld zitten): zie
deel drie
- en het tekenwindow met de eigenlijke turtle-graphics commando's: zie
deel drie
Eerst het opzetten van het programma. Na wat commentaar begin ik normaal
altijd met de foutcontrole zo hoog mogelijk te zetten, met 'use
strict'. Hier die ik dat echter nu net niet, omdat dan ook de
turtle-programma'tjes streng gecheckt worden, en dat is voor beginnende
programmeurs (kinderen) vaak wat te streng. Vandaar dat ik dit hier weer
uitgeschakeld heb door er een commentaarteken voor te zetten.
# Turtle Graphics, C.M. Moerman, 25 oct 1999
#
# This program creates an interactive Perl/Tk window
# for playing with Perl and Tk commands in a turtle-graphics way.
#use strict; # but not this time!
#use diagnostics -verbose;
Vervolgens laad ik de lijst met modules die ik wil gebruiken (uiteraard
Tk, plus twee standaard hulpbibliotheken van Tk). Vervolgens creëer ik
het top-level window met titel. Mainwindow->new() zorgt voor
het window, het handvat hiervan sla ik op voor latere referentie in
$title.
use Tk; # use Tk GUI routines
use Tk::Dialog; # esp. Dialog box for display help
use Tk::Balloon; # and balloon help
$title = "Turtle Graphics, KM'99; file=";
my $top = MainWindow->new(-title => $title);
Dan het frame met de knoppen. Om te beginnen definieer ik het frame waar
de knoppen in komen te hangen. Ook hier van sla ik het handvat weer op, nu in
$but_frame. Dit frame wil ik bovenaan het scherm met als
referentiepunt de noordwest hoek (-side => 'top', -anchor =>
'nw'), en ik zet nog wat attributen zodanig dat bij wijzigen van de
schermgrootte de breedte aangepast wordt op de dan volle breedte van het
scherm (-expand => 0, -fill => 'x'). Plus een mooi leeg
randje van 8 pixels aan de zijkanten.
# ---------------- menu buttons ---------------
my $but_frame = $top->Frame();
$but_frame->pack(-side => 'top', -anchor => "nw", -expand => 0, -fill => 'x', -padx => 8);
Nu maak ik een hulproutine om de knoppen wat makkelijker te
definiëren. Deze routine krijgt vier argumenten: het frame waar de
knoppen in moeten komen, de tekst op de knop, de tekst voor de helpballon, en
de functie die bij indrukken uitgevoerd moet worden (de actie). De routine
maakt vervolgens de knop, hangt er een helpballon met de opgegeven tekst aan,
en maakt een Alt-x shortcut gebaseerd op de eerste letter (waarbij de eerste
letter op de knop ook onderstreept wordt).
my $ball = $top->Balloon(); # balloon help
sub button { # create a menu-button
my ($this, $text, $help, $command) = @_;
my Part1 = $this->Button(-text => $text, -command => $command)->pack(-side => 'left');
$ball->attach(Part1, -balloonmsg => $help); # with attached help balloon
$top->bind("<Alt-". substr(lc($text), 0, 1) . ">", $command ); # plus Alt-? shortcut
Part1->configure(-underline => '0'); # underline first char
return Part1;
}
Hiermee kan ik de knoppen snel en eenvoudig maken.
Voor het vierde argument, de actie, gebruik ik meestal een verwijzing naar
een (in deel 2 besproken) functie, maar voor de drie laatste knoppen vul ik
de simpele functie ter plaatse in. Alle knoppen staat default links in het
frame, maar ik pas de 'help'-knop aan om die rechts neer te zetten met
pack(-side => 'right')
my $b_wisprog = button($but_frame, "Wis", "Wis tekening", \&erase);
my $b_newprog = button($but_frame, "Nieuw", "Wis het programma", \&newprog);
my $b_editprog = button($but_frame, "Laad", "Laad een programma", \&loadprog);
my $b_execprog = button($but_frame, "Doe het", "Voer het uit", \&execline);
my $b_saveprog = button($but_frame, "Opslaan", "Sla programma op", \&saveprog);
my $b_stopprog = button($but_frame, "Stop", "Stop je programma", sub { $stop = 1 } );
my $b_quitprog = button($but_frame, "Eind", "Beeindig TurtleGraphics", sub { $top->destroy; } );
my $b_helpprog = button($but_frame, "Help", "Laat help zien", sub { $help_dialog->Show(); } );
$b_helpprog->pack(-side => 'right');
Het window met de knoppenbalk is nu in grote lijnen klaar. Ik sla nu even
het help-scherm (definitie van $help_dialog) over, lees dit zelf maar in de
turtle.zip file. Is heel
simpel, maar door de uitlegtekst wat groot om hier in te voegen. Ga naar
deel twee voor het opzetten van het tekstwindow
onder de knoppenbalk, en de bijhorende hulproutines voor bijvoorbeeld het
lezen en schrijven van de files.