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:
#!perl
use strict;
use warnings;
use utf8;
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 => sub{ $mw->destroy(); },
)->pack(
-side => 'left',
);
$mw->MainLoop();
So sieht das Ergebnis aus:
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.
#perl
use strict;
use warnings;
use utf8;
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 => sub{ neu("neu"); },
);
$m_file->command(
-label => "Öffnen",
-command => sub{ open_file("open"); },
);
$m_file->command(
-label => "Speichern",
-command => sub{ save("speichern"); },
);
$m_file->command(
-label => "Beenden",
-underline => 1,
-command => sub { exit 0 },
);
$m_opti->command(
-label => "/usr/bin/perl -w $input",
-command => sub{ 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 => sub{ $mw->destroy; },
)->pack(
-side => 'left',
-expand => 0,
-fill => 'none',
);
$mw->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>', sub{ create($tw); });
} # sub neu
# Erzeugen einer neuen Datei
sub create {
my $toplevel = shift;
open(IFILE, ">> $input") or die "can't create '$input':$!\n";
close IFILE;
$toplevel->destroy(); #Fenster wieder löschen
} # sub create
sub open_file {
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>', sub{ read_file($tw); });
} # sub open_file
# Datei zum Lesen und Schreiben Öffnen
sub read_file {
open(IFILE, "< $input") or die "can't open '$input':$!\n";
while (<IFILE>) {
$text->insert("end", $_);
}
close IFILE;
$_[0]->destroy(); #Fenster wieder löschen
} # sub read_file
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>', sub{ write_file($tw); },);
} # sub save
#Speichern der Eingabe
sub write_file {
open(IFILE, "+< $input") or die "can't open '$input':$!\n";
print IFILE $text->get('1.0', 'end');;
close IFILE or die $!;
$_[0]->destroy(); #Fenster löschen
} # sub write_file
sub perl {
system("C:/Perl/bin/perl.exe $input");
} # sub perl
So sieht das Ergebnis aus:
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("C:/Perl/bin/perl.exe $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 auf der Widget-Seite zu Tk::Text.