GUI mit Perl/Tk

Perl/Tk-Tutorial

Kapitel 8: Steuerelement - Frames

Mit Frames fasst man (sichtbar oder unsichtbar) andere Fensterelemente zusammen. Zum Beispiel kann man Radiobuttons und Checkbuttons mit Frames zusammenfassen und somit optisch voneinander trennen.

Hierzu ein Beispiel, wie man mit Frames eine Aufteilung in mehrere Bereiche vornehmen kann:

frames1.pl

#!/usr/bin/perl

use strict;
use warnings;
use Tk;

my $main = MainWindow->new();

my $frame_left  = $main->Frame()->pack(-side => 'left');
$frame_left->Checkbutton(-text => "Kontrollkästchen 1")->pack();
$frame_left->Checkbutton(-text => "Kontrollkästchen 2")->pack();

my $frame_right = $main->Frame()->pack(-side => 'right');
$frame_right->Radiobutton(-text => "Optionsfeld 1")->pack();
$frame_right->Radiobutton(-text => "Optionsfeld 2")->pack();

$main->MainLoop();

So sieht das Ergebnis aus:

tk10.png

In diesem Beispiel richten Sie mit

my $frame_left  = $main->Frame()->pack(-side => 'left');

und

my $frame_right = $main->Frame()->pack(-side => 'right');

einen linken und einen rechten Bereich (Frame) im Hauptfenster ein. Der Zugriff erfolgt dann über die Referenzen auf die einzelnen Framebereiche und nicht mehr über die Referenz auf das Hauptfenster. Wenn Sie jetzt noch ein drittes Frame einfügen wollen, um einen Zwischenraum zwischen den beiden Frames zu schaffen, so genügt

my $frame_center = $main->Frame(-width => 100,   -height => 100     )
                         ->pack(-side => 'left', -anchor => 'center');

(Allerdings würde es hier auch reichen, das Fenster breiter zu machen.)

Nun sind Sie in der Lage mittels Frames Widgets zu Gruppen zusammenzufassen.


Hier noch ein paar weitere Skripte um ein Gefühl für die Frames zu bekommen:

frames2.pl

#!/usr/bin/perl
use strict;
use warnings;
use Tk;

my $top = MainWindow->new();

my $frame1 = $top->Frame(-width  => 200,
                         -height => 50,
                         -bg     => 'black');

my $frame2 = $top->Frame(-width  => 200,
                         -height => 50,
                         -bg     => 'red');

my $frame3 = $top->Frame(-width  => 200,
                         -height => 50,
                         -bg     => 'yellow');

$frame1->pack(-side => 'top');
$frame2->pack(-side => 'top');
$frame3->pack(-side => 'top');

$top->MainLoop();

So sieht das Ergebnis aus:

tk10.png

Durch die Anweisung -side des Geometriemanagers pack wird jedes Frame an den oberen Rand "angehängt", also unter frühere mit "top" gepackte Fensterelemente gepackt. Hier wird die Deutsche Nationalflagge dargestellt.


Das Ganze nun um 90 Grad gedreht:

frames3.pl

#!/usr/bin/perl
use strict;
use warnings;
use Tk;

my $top = MainWindow->new();

my $frame1 = $top->Frame(-width  => 50,
                         -height => 200,
                         -bg     => 'black');

my $frame2 = $top->Frame(-width  => 50,
                         -height => 200,
                         -bg     => 'red');

my $frame3 = $top->Frame(-width  => 50,
                         -height => 200,
                         -bg     => 'yellow');

$frame1->pack(-side => 'left');
$frame2->pack(-side => 'left');
$frame3->pack(-side => 'left');

$top->MainLoop();

So sieht das Ergebnis aus:

tk10.png

Jetzt wird jeder Frame an der linken Seite gepackt.


Es ist auch nicht schwer, mit Hilfe von Schleifen und Frames ein Schachbrett mit 64 Feldern darzustellen:

frames4.pl

#!/usr/bin/perl
use strict;
use warnings;
use Tk;

my $top    = MainWindow->new();

my @colors = ('#ededed', '#252525'); # dunkle Farbe, helle Farbe

for my $r (1..8) {
    my $row = $top->Frame->pack(-side => 'top');
    for my $c (1..8) {
        $row->Frame(
            -width  => 25,
            -height => 25,
            -bg     => $colors[($r + $c) % 2],
        )->pack(-side   => 'left');
   }
}

$top->MainLoop();

So sieht das Ergebnis unter Linux/Unix aus:

tk10.png

Zuerst wird immer ein Frame am oberen Rand angehängt, in dem 8 Felder von links nebeneinander eingefügt werden.


Um Frames in einer bestimmten Art darzustellen gibt es die Option relief:

frames5.pl

#!/usr/bin/perl
use strict;
use warnings;
use Tk;

my $mw = MainWindow->new();

my $f1 = $mw->Frame(
    -relief      => 'ridge',
    -width       => '120',
    -height      => '50',
    -borderwidth => '10',
)->pack(
    -side        => 'top',
    -pady        => '10',
    -padx        => '5',
);
my $text = $f1->Label(
    -text => "Dies relief nennt sich: ridge"
)->pack();

my $f2 = $mw->Frame(
    -relief      => 'groove',
    -width       => '120',
    -height      => '50',
    -borderwidth => '10',
)->pack(
    -side        => 'bottom',
    -pady        => '10',
    -padx        => '5',
);
my $text2 = $f2->Label(
    -text => "Dies relief nennt sich: groove"
)->pack();

$mw->MainLoop();

So sieht das Ergebnis aus:

tk14.png

Weitere Reliefs: "flat", "raised", "sunken" und "solid".

Top