File Dialogs - Datei-Dialoge

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 und getSaveFile

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.
-filetypes => [
    ['Bezeichnung', [qw/Endung/]],
]
Definiert die im Dialog verfügbaren Dateierweiterungen. Beispiel: der nachstehende Code erlaube die Auswahl von Perl-Dateien mit der Endung .pl, .pm oder .pmx
my @ext = (
    ["All Source Files",    [qw/.pl .pm .pmx/]],
    ["All files",           ['*']],
);
my $answer = $mw->getOpenFile(
    -filetypes => \@ext,
);
-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...")

Datei-öffnen-Dialog in Perl/Tk

#!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

chooseDirectory

Eingebautes Widget zur Auswahl von Verzeichnissen. Sozusagen getOpenFile für Verzeichnisse.

Native Verzeichnisauswahl in Perl/Tk

#!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

Tk::FileSelect ist eine andere, eher veraltet wirkende Möglichkeit eine Datei auszuwählen. So sieht der Dialog aus:

alter Datei-öffnen-Dialog in Perl/Tk

#!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

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.

Datei auswählen mit Tk::FBox

#!perl

use strict;
use warnings;
use Tk;
use Tk::FBox;

my $mw = tkinit();

my $file = $mw->FBox()->Show();

$mw->MainLoop();

Tk::DirTree

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.

Von Hand gestrickter Dialog zur Verzeichnisauswahl

#!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

Tk::DirSelect ist ähnlich wie chooseDirectory ein Dialog-Widget zur Auswahl eines Verzeichnisses.

Screenshot von Tk::DirSelect (Perl/Tk-Widget)

#!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();
Top