Sehr Umfangreiche Webseite zum Programmieren in C Perl CGI, Skripting, Linux, SystemprogrammierungPerl Perl Kurs Skripting Tk-Modul use Tk; Tcl/Tk Menu, Menubutton,Message Tk Menu, Menubutton,Message Steuerelement Perl Skript Tk-Modul Tk use Tk Perl mit dem Tk-Modul Teil 13

Steuerelemente - Menu, Menubutton,Message           zurück zum Inhaltsverzeichnis

Als nächstes lernen Sie Steuerelemente kennen, womit Sie Menüs erzeugen können um Beispielsweise einen Texteditor zu erzeugen ...

#!/usr/bin/perl -w

use strict;
use Tk;

# Deklarationen unserer Variablen
my ($mw);
my ($mb, $m_file, $m_edit, $m_opts, $m_help);
my ($m_help_about);
my ($o_radio, $o_check1, $o_check2)=0;

# Wir erzeugen ein neues Fenster
$mw = MainWindow->new();


##### Zuerst erstellen wir eine horizontale Menübar
$mb = $mw->Frame(-relief => 'ridge', -bd => 5);

# Jetzt erstellen wir die Menübuttons für die Menübar
$m_file = $mb->Menubutton(-text      => "Datei",
                          -underline => 1);
#underline=Buchstabennummer die Unterstichen werden soll >-= a
$m_edit = $mb->Menubutton(-text      => "Bearbeiten",
                          -underline => 0);
$m_opts = $mb->Menubutton(-text      => "Optionen",
                          -underline => 0);
$m_help = $mb->Menubutton(-text      => "Hilfe",
                          -underline => 0);

# Zeig es uns
$mb->pack(-side => "top", -fill => "x");
$m_file->pack(-side => "left");
$m_edit->pack(-side => "left");
$m_opts->pack(-side => "left");
$m_help->pack(-side => "right");

#### Jetzt erstellen wir die Untermenüs

# Die Dateimenüs
$m_file->command(-label => "Neu",
                 -command => [\&file, "neu"]);
$m_file->command(-label => "Öffnen",
                 -command => [\&file, "open"]);
$m_file->command(-label => "Speichern",
                 -command => [\&file, "speichern"],
                 -state => "disabled");  #Deaktiviert
$m_file->command(-label => "Speichern unter...",
                 -command => [\&file, "speichern unter..."],
                 -state => "disabled");   #Deaktiviert
#Ein Seperator der immer unten positioniert wird  und von den anderen Getrennt ist
$m_file->separator();
$m_file->command(-label => "Exit",
                 -underline => 1,
                 -command => sub { exit 0; });

# Berarbeiten Untermenü
$m_edit->command(-label   => "Kopieren",
                 -command => [\&edit, "kopieren"]);
$m_edit->command(-label   => "Ausschneiden",
                 -command => [\&edit, "ausschneiden"]);
$m_edit->command(-label => "Einfügen",
                 -command => [\&edit, "einfügen"]);

# Optionsmenü
$m_opts->command(-label   => "Ausführen",
                 -command => [\&opts, "ausführen"]);
#Wieder seperat..............
$m_opts->separator();
#Checkboxen und Radiobuttons
$m_opts->checkbutton(-label    => "Check 1",
                     -variable => \$o_check1,
                     -command  => [\&opts, "check"]);
$m_opts->checkbutton(-label    => "Check 2",
                     -variable => \$o_check2,
                     -command  => [\&opts, "check"]);
$m_opts->separator();
$m_opts->radiobutton(-label    => "Radio 1",
                     -variable => \$o_radio,
                     -value    => "r1",
                     -command  => [\&opts, "radio"]);
$m_opts->radiobutton(-label    => "Radio 2",
                     -variable => \$o_radio,
                     -value    => "r2",
                     -command  => [\&opts, "radio"]);

# Hilfe Menu
$m_help->command(-label => "Inhalt",
                 -command => [\&help, "inhalt"]);
$m_help->command(-label => "Hilfe",
                -command => [\&help, "hilfe"]);
#wieder mal seperat
$m_help->separator();

#Ein Untermenü im Untermenü...............
$m_help_about = $m_help->cget(-menu)->Menu();
$m_help->cascade(-label => "Über.....",
                  -menu => $m_help_about);
#Inhalt des Unter-Untermenü ;)
$m_help_about->command(-label => "Perl",
                       -command => [\&about, "perl"]);
$m_help_about->command(-label => "Tk",
                       -command => [\&about, "tk"]);
$m_help_about->command(-label => "UNIX",
                       -command => [\&about, "unix"]);
$m_help_about->command(-label => "C/C++",
                        -command => [\&about, "C/C++"]);

MainLoop;

#### die callbacks
sub file {
    my ($arg) = @_;
    my $tw=$mw->Toplevel(-title => "Datei $arg");
    my $mes=$tw->Message(-text => "Datei $arg ist nicht aktiv",
                         -width => '10c', -justify => 'center')->
                         pack(-side => 'top');
    my $but=$tw->Button(-text => "Schließen",
                        -command => [$tw => 'destroy'])->pack(-side => 'top');
}

sub edit {
    my ($arg) = @_;
    my $tw=$mw->Toplevel(-title => "Bearbeitung $arg");
    my $mes=$tw->Message(-text => "Bearbeitung $arg ist nicht aktiv",
                         -width => '10c', -justify => 'center')->
                         pack(-side => 'top');
    my $but=$tw->Button(-text => "Schließen",
                        -command => [$tw => 'destroy'])->
                        pack(-side => 'top');
}

sub opts {
    my ($arg) = @_;
    print "opts: $arg\n";
    print "radio  : $o_radio\n";
    print "check 1: $o_check1\n";
    print "check 2: $o_check2\n";
}

sub help {
    my ($arg) = @_;
    my $tw=$mw->Toplevel(-title => "Hilfe $arg");
    my $mes=$tw->Message(-text => "Hilfe $arg ist nicht aktiv",
                         -width => '10c', -justify => 'center')->
                         pack(-side => 'top');
    my $but=$tw->Button(-text => "Schließen",
                        -command => [$tw => 'destroy'])->
                        pack(-side => 'top');
}

sub about {
    my ($arg) = @_;
    print "about: $arg\n";
}

So siehts aus (Linux/Unix):

Steuerelement Menu, Menubutton,Message Linux/Unix

So siehts aus (MS Windows):

Steuerelement Menu, Menubutton,Message MS Windows

Das Programm scheint auf den ersten Blick durch seine Länge etwas abschreckend. Es ist aber im Prinzip recht simpel und der Allgemeine Vorgang eine Menü aufzubauen. Zuerst wird ein Hauptfenster erzeugt und anschließend ein Frame. Danach erstellen man mit ...

Menubutton()

... die einzelnen Menübuttons. Anschließend erstellen Sie mittels ...

$m_file->command(-label => "Neu", -command => [\&file, "neu"]);

... entsprechende Untermenüs mit dem Label und möglichst auch mit einer Callback-Funktion. Um ein weiteres Untermenü im Untermenü zu erstellen verwendet man ...

$m_help_about = $m_help->cget(-menu)->Menu();

Die einzelnen Callback-Funktionen sind eigentlich Nutzlos und öffnen nur ein neues Fenster mit einer Message welches mit ...

my $mes=$tw->Message(-text => "Datei $arg ist nicht aktiv",
-width => '10c', -justify => 'center')->pack(-side => 'top');

... erzeugt wurde.