Programming Republic of Perl Logo

Uitleg deel 1 van Turtle graphics

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;
}

De knoppenbalkHiermee 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.