Tutorial zu Perl mit dem Tk-Modul

Kapitel 14 : Steuerelement - Text


Zurück Index Weiter


Was fehlt uns jetzt noch für einen Texteditor? Richtig ein Widget mit dem Sie Text verarbeiten können. Und dafür gibt das gleichnamige Widget Text. Hier ein Beispielprogramm:

text1.pl

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

use Tk;

# Zuerst wieder ein Hauptfenster und ein Frame
my $mw    = MainWindow->new();
my $frame = $mw->Frame();

# Jetzt erstellen wir unser Text-Widget
# mit 2 Scrollbars in unserem Frame
my $text = $frame->Text(-wrap => 'none');

my $yscr = $frame->Scrollbar(-command => [yview => $text],
                             -orient  => 'vertical',
                            );
my $xscr = $frame->Scrollbar(-command => [xview => $text],
                             -orient  => 'horizontal',
                            );

# Jetzt verbinden wir die beiden Scrollbars mit dem Text-Widget:
$text->configure(-yscrollcommand => [ set => $yscr ]);
$text->configure(-xscrollcommand => [ set => $xscr ]);

# Jetzt packen wir wieder alles zusammen:
$frame->pack(-side   => 'top',
             -expand => 1,
             -fill   => 'both',
            );
$yscr->pack(-side   => 'right',
            -expand => 0,
            -fill   => 'y',
           );
$xscr->pack(-side   => 'bottom',
            -expand => 0,
            -fill   => 'x',
           );
$text->pack(-side   => 'left',
            -expand => 1,
            -fill   => 'both',
           );

# Der Exit Button:
my $fbut = $mw->Frame()->pack();
my $bxit = $fbut->Button(-text    => 'Exit',
                         -command => [$mw => 'destroy'],
                        )
                  ->pack(-side => 'left',
                        );

MainLoop();

So sieht das Ergebnis unter Linux/Unix aus:

tk22.png

und so unter Windows:

tk22_win.png

(Aktuelle Bilder für Linux werden noch nachgestellt.)

Wenn Sie das Programm starten, haben Sie bereits einen echten Texteditor vor sich mit Copy und Paste und vielen weiteren Funktion (rechte Maustaste gedrückt halten über dem Text). Natürlich fehlt es dem Text-Editor noch an Lade und Speicheroptionen und sonstigen Komfort.


Daher werden Sie jetzt Lade und Speicher-Funktionen hinzufügen. Des weiteren soll der Texteditor auch Perl und Tk Skripts Interpretieren und Ausführen können.

text2.pl

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

use Tk;

my $input = 'noname.pl';

# Zuerst wieder ein Hauptfenster und zwei Frames:
my $mw     = MainWindow->new();
my $frame  = $mw->Frame();
my $frame2 = $mw->Frame();

# Menubuttons
my $m_file = $frame2->Menubutton(-text      => "Datei",
                                 -underline => 0,
                                );
my $m_opti = $frame2->Menubutton(-text      => "Ausführen",
                                 -underline => 0,
                                );
my $m_help = $frame2->Menubutton(-text      => "Hilfe",
                                 -underline => 0,
                                );

# Jetzt erstellen wir unser Text-Widget mit 2 Scrollbars
# in unserem Frame, allerdings diesmal via Scrolled:
my $text = $frame->Scrolled('Text',
                            -wrap       => 'none',
                            -scrollbars => 'osoe',
                            -background => 'white',
                            -foreground => 'blue',
                            -width      => 80,
                            -height     => 35,
                            -font       => '{Courier New} 12 {normal}',
                           );

# Jetzt packen wir wieder alles zusammen:
$m_file->pack(-side   => 'left',
              -expand => 0,
              -fill   => 'x',
             );
$m_opti->pack(-side   => 'left',
              -expand => 0,
              -fill   => 'none',
             );
$m_help->pack(-side   => 'left',
              -expand => 0,
              -fill   => 'none',
             );
$frame2->pack(-side   => 'top',
              -expand => 0,
              -fill   => 'x',
             );
$frame-> pack(-side   => 'top',
              -expand => 1,
              -fill   => 'both',
             );
$text->  pack(-side   => 'left',
              -expand => 1,
              -fill   => 'both',
             );

$m_file->command(-label     => "Neu",
                 -command   => [\&neu, "neu"],
                );
$m_file->command(-label     => "Öffnen",
                 -command   => [\&open, "open"],
                );
$m_file->command(-label     => "Speichern",
                 -command   => [\&save, "speichern"],
                );
$m_file->command(-label     => "Beenden",
                 -underline => 1,
                 -command   => sub { exit 0 },
                );
$m_opti->command(-label     => "/usr/bin/perl -w $input",
                 -command   =>  \&perl,
                );

$m_help->command(-label     => "Autor",
                 -command   => sub {},
                );
$m_help->command(-label => "Hilfe",
                 -command => sub{},
                );

# Der Exit Button:
my $fbut = $mw->Frame()->pack();
my $bxit = $fbut->Button(-text    => 'Exit',
                         -command => [$mw => 'destroy'],
                        )
                  ->pack(-side => 'left',
                         -expand => 0,
                         -fill   => 'none',
                        );

MainLoop();


sub file {
} # sub file


sub neu {
    my $tw = $mw->Toplevel(-title => 'Neu');
    $tw->Label(-text => "Wie soll die Datei heißen : ")->pack();
    my $in = $tw->Entry(-textvariable => \$input)->pack();
    $in->bind('<Return>', [\&create, $tw]);
} # sub neu


# Erzeugen einer neuen Datei
sub create {
    CORE::open (IFILE, ">> $input") or die "can't create '$input':$!\n";
    close IFILE;
    $_[1]->destroy();  #Fenster wieder löschen
} # sub create


sub open {
    my $tw = $mw->Toplevel(-title => 'Öffnen');
    $tw->Label(-text => "Welche Datei wollen sie Öffnen : ")->pack();
    my $in = $tw->Entry(-textvariable => \$input)->pack();
    $in->bind('<Return>', [ \&read, $tw ]);
} # sub open


# Datei zum Lesen und Schreiben Öffnen
sub read {
    CORE::open (IFILE, "< $input") or die "can't open '$input':$!\n";
    while (<IFILE>) {
        $text->insert("end", $_);
    }
    close IFILE;
    $_[1]->destroy();  #Fenster wieder löschen
} # sub read


sub save {
    my $tw = $mw->Toplevel(-title => 'Speichern');
    $tw->Label(-text => "Speichern : $input")->pack();
    my $in=$tw->Entry(-textvariable => \$input)->pack();
    print $input , "\n";
    $in->bind('<Return>', [\&write, $tw]);
} # sub save


#Speichern der Eingabe
sub write {
    CORE::open (IFILE, "+< $input") or die "can't open '$input':$!\n";
    print IFILE $text->get('1.0', 'end');;
    close IFILE or die $!;
    $_[1]->destroy(); #Fenster löschen
} # sub write


sub perl {
    system("/usr/bin/perl -w $input");
} # sub perl

So sieht das Ergebnis unter Linux/Unix aus:

tk23.png

und so unter Windows:

tk23_win.png

(Aktuelle Bilder für Linux werden noch nachgestellt.)

Das Programm können Sie natürlich Ihren Bedürfnissen anpassen oder weiterverarbeiten. Anhand des Beispiels konnten Sie sehen wie einfach es ist mit Hilfe von Perl und Tk passable Programme zu schreiben. Neu ist in diesem Programm die Funktion

system("/usr/bin/perl -w $input");

mit der Sie Programme oder Aktionen ausführen können wie wenn Sie diese in der Kommandozeile eingeben würden.


Eine noch komfortablere Version mit "richtigen" Menüs haben Sie schon im Kapitel 13 als menu2.pl kennengelernt.

Ich würde dieses Programm als Basis für weitere Experimente mit einem Editor empfehlen.


Zum Text-Widget gibt es wie immer Hilfe mit perldoc Tk::Text.


Zurück Index Weiter


-- ChristianDuehl - 09 Dec 2003

-- ChristianDuehl - 23 Jan 2004
Topic attachments
I Attachment Action Size Date Who Comment
text1.pl.txttxt text1.pl.txt manage 1.5 K 2004-01-23 - 13:13 ChristianDuehl Quellcode zu text1.pl
text2.pl.txttxt text2.pl.txt manage 4.6 K 2004-01-23 - 13:13 ChristianDuehl Quellcode zu text2.pl
Topic revision: 2004-01-23, ChristianDuehl
 
Bitte die NutzungsBedingungen beachten.
Bei Vorschlägen, Anfragen oder Problemen mit dem PerlCommunityWiki bitten wir um WebBottomBarExample">Rückmeldung.