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.