Zur Auswahl einer Datei oder eines Verzeichnisses werden Dialoge verwendet. Meistens sind dazu getOpenFile()
und getSaveFile()
ausreichend. Für Verzeichnisse gibt es chooseDirectory()
. Es gibt jedoch eine Reihe weiterer Widgets die sich dieser Aufgabe annehmen:
getOpenFile()
ist ein Dialog-Widget mit dem man eine Datei auswählen kann.
Der entsprechende Perl/Tk-Dialog zum Speichern einer Datei ist getSaveFile()
.
Gängige Optionen für diesen Dialog sind:
Widget-Option | Funktion |
---|---|
-defaultextension => 'Dateierweiterung' |
Gibt die Standard-Dateierweiterung an, die verwendet wird, wenn ein Dateiname ohne Erweiterung eingegeben wird. |
|
Definiert die im Dialog verfügbaren Dateierweiterungen.
Beispiel: der nachstehende Code erlaube die Auswahl von Perl-Dateien mit der Endung .pl , .pm oder .pmx
|
-initialdir => 'Verzeichnis' |
Definiert das Verzeichnis, das voreingestellt ist, wenn der Dialog aufgeht. |
-initialfile => 'Dateiname' |
Nur für getSaveFile() : wird als Standard-Dateiname angezeigt, wenn der Speichern-Dialog aufgeht. Kann vom Benutzer überschrieben werden. |
-title => 'Dialog-Titel' |
Bestimmt den Titel, der in der Fensterleiste des Dialogs angezeigt wird (z.B. "Datei öffnen...") |
#!perl
use strict;
use warnings;
use Tk;
my $mw = Tk::MainWindow->new();
my $button = $mw->Button(
-text => "Select a file",
-command => \&show_file_dialog,
)->pack(-side => 'left',);
my $label = $mw->Label(
-text => 'No file yet',
)->pack(-side => 'left',);
$mw->MainLoop();
sub show_file_dialog {
my @ext = (
["All Source Files", [qw/.pl .pm .pmx/]],
["Image Files", [qw/.gif .png .jpg/]],
["All files", ['*']],
);
my $answer = $mw->getOpenFile(
-filetypes => \@ext,
);
$label->configure(-text => $answer);
} # /show_the_dialog
Eingebautes Widget zur Auswahl von Verzeichnissen. Sozusagen getOpenFile für Verzeichnisse.
#!perl
use strict;
use warnings;
use utf8;
use Tk;
my $mw = tkinit();
$mw->Button(
-text => 'Verzeichnis auswählen',
-command => sub{
if( my $dir = $mw->chooseDirectory ) {
$mw->messageBox(-message => "Dir: $dir");
}
},
)->pack;
$mw->MainLoop;
exit(0);
Tk::FileSelect ist eine andere, eher veraltet wirkende Möglichkeit eine Datei auszuwählen. So sieht der Dialog aus:
#!perl
use strict;
use warnings;
use utf8;
use Tk;
use Tk::FBox;
use File::HomeDir;
use Tk::FileSelect;
my $mw = tkinit();
my $home = File::HomeDir->my_home;
my $FSref = $mw->FileSelect(
-directory => $home,
);
my $file_label = $mw->Label()->pack;
$mw->Button(
-text => 'Pick file',
-command => sub{
my $file = $FSref->Show;
if( $file ) {
$file_label->configure(-text => 'File: ' . $file);
}
},
)->pack;
$mw->MainLoop;
Tk::FBox ist wie getOpenFile. Laut Manpage kommt es ind er Unix-Welt zum Einsatz, wenn es keine andere Implementierung für getOpenFile oder chooseDirectory gibt.
#!perl
use strict;
use warnings;
use Tk;
use Tk::FBox;
my $mw = tkinit();
my $file = $mw->FBox()->Show();
$mw->MainLoop();
Alternativ zu chooseDirectory kann Tk::DirTree verwendet werden, damit ein Nutzer per GUI ein Verzeichnis auswählen kann. Allerdings handelt es sich dabei streng genommen nicht um ein Dialog-Widget, sondern um ein von Tk::Tree abgeleitetes Widget zur Darstellung von Verzeichnissen. Die Dialog-Funktion muss man sich noch selbst dazu schreiben. Oder man verwendet direkt Tk::DirSelect.
#!perl
use strict;
use warnings;
use utf8;
use Tk;
use Tk::DirTree;
use File::HomeDir;
use Tk::DialogBox;
my $mw = MainWindow->new;
$mw->title("DirTree-Dialog");
my $initial_dir = File::HomeDir->my_data;
$mw->Button(
-text => 'Verzeichnisauswahl mit Tk::DirTree',
-command => sub{
if( my $dir = show_directory_picker($mw, $initial_dir) ) {
$mw->messageBox(-message => "Gewähltes Verzeichnis: [$dir]");
}
},
)->pack;
sub show_directory_picker {
my $toplevel = shift or die('Missing toplevel widget');
my $init_dir = shift or die('Missing initial directory');
my $dialog = $mw->DialogBox(
-title => "Verzeichnis auswählen...",
-buttons => ["Auswählen", "Abbrechen"],
);
my $selected_dir = undef;
my $frame = $dialog->add('Frame')->pack(-expand => 1, -fill => 'both');
my $dt = $frame->Scrolled('DirTree',
-scrollbars => 'osoe',
-width => 30,
-height => 25,
-exportselection => 1,
-browsecmd => sub {$selected_dir = shift},
)->pack(-fill => "both", -expand => 1);
$dt->chdir($init_dir);
if( my $button = $dialog->Show() ) {
if( $button eq 'Auswählen' ) {
return $selected_dir;
}
}
return undef;
} # /show_directory_picker
$mw->MainLoop;
exit(0);
Tk::DirSelect ist ähnlich wie chooseDirectory ein Dialog-Widget zur Auswahl eines Verzeichnisses.
#!perl
use strict;
use warnings;
use Tk;
use FindBin qw/$Bin/;
use Tk::DirSelect;
my $mw = Tk::MainWindow->new();
my $ds = $mw->DirSelect();
my $dir = $ds->Show($Bin);
$mw->MainLoop();