How To: Grafische Ausgabe mit MacPerl
Eines der von vielen schmerzlich vermißten Funktionen bei Perl ist das Fehlen jedweder grafischen Ausgabe. Zwar gibt es unter *NIX mittlerweile eine Schnittstelle zu Tcl/Tk, aber unter MacPerl ist diese nicht verfügbar.
Was viele jedoch nicht wissen: Es ist unter MacPerl sehr einfach auf Funktionen der Macintosh Toolbox zuzugreifen und die grafische Ausgabe darüber zu leiten. Um z.B. ein einfaches Fenster aufzumachen und darin Grafik und Text auszugeben, benötigt man nur folgende Module: Mac::Windows
muß aufgerufen werden, um ein Fenster zu erstellen, Mac::QuickDraw
ist für die Ausgabe von Grafiken zuständig, Mac::Fonts
gibt Text aus und Mac::Events
ist für die Ereignisbehandlung wie Tastatur- und Mauseingaben verantwortlich.
Als Beispiel habe ich mein Standard-Testprogramm, die Schmetterlingskurve, gewählt (ein Python-Skript, das das gleiche leistet und Hintergrundinformationen zur Kurve gibt es hier). Erst einmal ein Screenshot:
Der Quelltext des Perl-Skripts ist von erfrischender Kürze:
#!perl
use strict; use Mac::Windows; use Mac::QuickDraw; use Mac::Fonts; use Mac::Events;
my ($style, $title, $win, $winrect);
$style = noGrowDocProc(); $title = "Butterfly"; $winrect = Rect->new(75, 75, 400, 400); $win = MacWindow->new($winrect, $title, 1, $style, 1); $win->sethook("redraw" => \&drawIt);
while ($win->window()) { WaitNextEvent(); }
END { $win->dispose() if (defined($win)); }
sub drawIt { my ($theta, $r, $x, $y); $theta = 0.0; while ($theta < 75.39) { $r = exp(cos($theta)) - 2*cos(4*$theta) + (sin($theta/12))**5; # In Polarkoordinaten konvertieren: $x = $r*cos($theta); $y = $r*sin($theta); # auf Fenstergröße skalieren $x = ($x*30) + 150; $y = ($y*30) + 150; if ($theta == 0.0) { MoveTo($x, $y) } else { LineTo($x, $y) } $theta += 0.02; } TextSize(12); MoveTo(60, 300); DrawString("Schmetterlingskurve in MacPerl"); }
Zuerst wird der Fenstertyp festgelegt, in diesem Fall ein normales Fenster, bei dem aber keine Größenveränderung zugelassen wird. Dann werden die Koordinaten des Fensters (in Bildschirmkoordinaten, links oben, rechts unten) bestimmt und schließlich das Fenster angelegt. Schließlich wird noch ein Callback
gesetzt, der festlegt, daß die Routine drawIt
immer dann aufgerufen wird, wenn ein Redraw des Fensters notwendig ist.
Das Programm beendet sich automatisch, wenn in die Closebox des Fenster geklickt wird, weitere Event-Behandlungen sind daher in diesem Fall nicht erforderlich.
Literatur:
Vicki Brown and Chris Nandor: MacPerl. Power and Ease, Sunnyvale CA (Primetime Freeware) 1998