Login
Login-Name Passwort


 
Newsletter
Werbung

Do, 21. September 2000, 00:00

Programmieren mit Perl/Tk - Eine Einführung

Wozu braucht man Perl/Tk? Das werden sich jetzt sicherlich einige von euch fragen.

Ganz einfach...

Wolltet ihr nicht schon immer mal ein Programm mit grafischer Benutzeroberfläche schreiben, aber seid daran gescheitert, daß ihr zu wenig C beherrscht und Qt oder Gtk erst recht nicht? Dann liegt ihr mit Perl/Tk genau richtig! Perl/Tk kombiniert die relativ einfache Programmiersprache Perl mit dem relativ einfach zu verstehenden Toolkit Tk. Ich werde versuchen, euch hier eine kleine Einführung zu geben und hoffe, daß ihr Gefallen an Perl/Tk findet. Und auch an diesem kleinen Tutorial...

Installieren

Wenn ihr noch kein Perl/Tk auf dem Rechner habt und es nicht als Paket für eure Distribution verfügbar ist, dann müsst ihr es euch erst herunterladen:

http://www.cpan.org/modules/by-module/Tk/

Entpackt es und installiert es dann so:

perl Makefile.PL
make
make test
make install

Hoffen wir mal, daß das geklappt hat.

Unser erstes Programm

 

#!/usr/bin/perl -w
use Tk;
$mainw = new MainWindow(-title => "Useful...");
my $label = $mainw->Label(-text => "Hello Galaxy!");
$label->pack();
my $exit_button = $mainw->Button(-text => "Exit",
 -command => sub { exit } )->pack(-fill => "x");
MainLoop;

Zuerst muss immer das Tk-Modul geladen werden, damit der Perl-Interpreter die Tk-Befehle auch verstehen kann. Dann kann damit angefangen werden, ein neues Hauptfenster zu erstellen. Nun wird dem Hauptfenster ($mainw) ein Label zugewiesen. Mit my $label = $mainw->Label(-text => "Hello Galaxy!"); ist es aber noch nicht getan, da es so nicht sichtbar wäre. Das Label muss erst, im wahrsten Sinne des Wortes, hingepackt werden $label->pack();.

Zum Schluss der Hauptroutine muss immer ein MainLoop stehen. MainLoop sorgt dafür, daß die Ereignisschleife aufrecht erhalten wird. Sonst könnte man keine Benutzereingaben machen, da das Programm in einem Rutsch durchlaufen würde.

Pack, ein Geometriemanager

Pack ist der populärste Geometriemanager unter Tk. Es gibt noch ein paar andere, aber auf die möchte ich hier nicht eingehen.

Wie oben schon angeschnitten, verwaltet pack die Position der Widges. Solange pack keinem Widget zugeordnet ist, wird es auch nicht sichtbar sein. Hier einige Optionen von pack:

-side => "left" | "right" | "top" | "bottom" Platziert das Widget an die angegebene Seite des Fensters oder Frames.
-fill => "none" | "x" | "y" | "both" Das Widget breitet sich in die angegebene Richtung aus.
-expand => 1 | 0 Füllt den restlichen Platz im Fenster aus.
-anchor => "n" | "ne" | "e" | "se" | "s" | "sw" | "w" | "nw" | "center" Verankert das Widget in seinem Rechteck
-padx => Betrag , -padx => Betrag Definiert einen Abstand zum anderen Widget

Widget-Optionen

Die meisten Widgets besitzen Optionen, mit denen deren Aussehen und Verhalten geändert wird. Ich werde hier die wichtigsten aufführen.

-anchor => "n" | "ne" | "e" | "se" | "s" | "sw" | "w" | "nw" | "center" Der Text wird an dieser Position verankert.
-background => Farbe Legt die Hintergrundfarbe des Widgets fest.
-borderwidth => Betrag Ändert die Breite des Rahmens. -> (-relief)
-command => Callback Aktiviert die Callback-Funktion, wenn das Widget angeklickt wird.
-height => Betrag , -width => Betrag Ändert die Höhe oder Breite des Widgets.
-justify => "left" | "right" | "center" Ausrichtung von mehrzeiligen Text.
-relief => "flat" | "groove" | "raised" | "ridge" | "sunken" | "solid" Ändert den Kantentyp.
-state => "normal" | "disabled" | "active" Der Status des Widgets.
-text => "Text" Der Textstring, der im Widget angezeigt wird.
-textvariable => \$text Wie -text , nur das sich der Text ändert, wenn $text sich ändert.
-title => "Titel" Gibt dem Widget einen Titel. Funktioniert nur bei Frames und Fenstern.

Die Optionen stehen immer in der Klammer hinter dem Widgetnamen.

Frames

Das Frame-Widget wird benötigt, um andere Widgets zusammenzufassen. Dies ist sehr wichtig, da die Geometriemanager auch nicht all zu mächtig sind. Z.B. kann man mit Frames sehr gut eine Buttonleiste erstellen.

 

#!/usr/bin/perl -w
use Tk;
$mainw = new MainWindow(-title => "Buttonleiste");
my $frame = $mainw->Frame(-relief => "groove",
 -borderwidth => "2")->pack(-padx => 5,pady => 5);
my $exit_button = $frame->Button(-text => "Exit",
 -command => sub { exit } )->pack(-side => "left");
my $setup_button = $frame->Button(-text => "Setup")->pack(-side => "left");
my $print_button = $frame->Button(-text => "Print")->pack(-side => "left");
MainLoop;

Wie man sehen kann, sind die Widgets jetzt nicht mehr dem Fenster, sondern dem Frame zugewiesen.

Die wichtigsten Widgets

Hier zeige ich euch die wichtigsten Widgets unter Perl/Tk. Sonst wißt ihr ja gar nicht, welche es unter Perl/Tk alle gibt.

Im Prinzip werden alle Widgets gleich behandelt. Aber wie das so ist, hat jedes Widget auch seine eigenen Eigenschaften, die ich hier kurz anschneiden werde.

Checkbutton: Wie lese ich den Wert des Checkbuttons aus? Ganz einfach...

$cb = $mainw->Checkbutton(-text => "Willst Du ...? ",
 <strong>-variable =>\$value</strong>);

In der Variable $value wird der boolesche Wert gespeichert (0 = unchecked, 1 = checked).

Radiobutton: Der Radiobutton verhält sich so ähnlich wie der Checkbutton. Eine Gruppe von Radiobuttons wird in Frames zusammengefasst. Wie überall lässt sich der Befehl "-command" hier gut verwenden.

Scale: Der Code einer Scale sieht folgendermaßen aus:

$scale = $mainw->Scale(-from => 1, -to => 10,
 -orient => "horizontal", -command =>sub { $position =$scale->get } );

Bei einer Scale liest man deren Zustand mit 'get' aus. Also:

$position =$scale->get;

Eine Scale sollte man nicht mit einer Scrollbar verwechseln!

Listbox: Bei einer Listbox werden Einträge mit 'insert' eingefügt. Hier ein Codebeispiel:

$listbox =$mainw->Listbox(-selectmode =>"single")->pack();
$listbox->insert('end', qw/red yellow green blue grey/);
$listbox->bind('<Button-1>', sub { $listbox->configure(-background
 => $listbox->get($listbox->curselection()) );
});

Zu configure: Mit 'configure' kann man nachträglich die Widget-Optionen ändern.

So... Das war es erstmal mit den Widgets. Es waren bei weitem nicht alle. Ich habe nur keine Lust, hier alle aufzuführen.

Bind

Wie man bei der Listbox schon gesehen hat, werden mit 'bind' Benutzerereignisse abgefangen. Z.B. bei einen Entry:

$entry= $mainw->Entry(-textvariable => \$text,-width => "40");
$entry->bind("<Return>", sub { &check($text) });

Hier die Modifikatoren:

Control <Control-Button-1>
Shift <Shift-Button-2>
Lock <Lock-c>
Alt <Alt-x>
Button-1 -5 Die Mausbuttons
Double Es muss etwas zweimal passieren. Z.B. Doppelclick
Triple Es muss dreimal passieren. (Für Verrückte) ;)

Toplevel Widgets

Toplevels Widgets sind neue Fenster, die aus dem Hauptfenster hervorgehen.

if (!Exists($topw))
{
 $topw = $mainw->Toplevel(-title => "Hallo");
 my $label = $topw->Label(-text =>"Hallo")->pack();
 my $close =$topw->Button(-text
=>"Close",-command =>sub { $topw->withdraw })->pack();
}
else
{
 $topw->deiconify();
 $topw->raise();
}

So! Das war es erstmal...

Ich hoffe, euch hat dieses kleine Tutorial gefallen und ihr wollt euch jetzt weiter mit der Materie beschäftigen.

Wenn ich irgendwelche Fehler gemacht habe, dann lasst es mich bitte wissen.

Kommentare (Insgesamt: 0 || Kommentieren )
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung