Wie erzeuge ich Dialog-Widgets?
Inhalt:
Häufig muss man den Benutzer eines Programms vor einer Aktion noch etwas sagen oder man möchte dem Benutzer
noch etwas mitteilen. So möchte man vor dem Schließen des Programms noch fragen, ob die Datei gespeichert
werden soll oder der Benutzer hat eine falsche Eingabe gemacht und man möchte ihm das mitteilen und so weiter.
Anwendungsbeispiele für den Einsatz des Dialog-Widgets gibt es viele.
Wie erzeuge ich eine einfache Meldung?
Angenommen, der User hat eine ungültige E-Mail-Adresse eingegeben und wir möchten ihn darauf aufmerksam machen. Das geht ziemlich einfach mit der messageBox-Methode:
#! /usr/bin/perl
use strict;
use warnings;
use Tk;
my $mw = MainWindow->new();
$mw->Label(-text => 'Dies ist ein Test')->pack();
my $text = "Sind Sie sich sicher mit der Adresse?\nSie haben eine ungueltige E-Mail-Adresse eingegeben";
$mw->messageBox(-title => 'Test',
-message => $text,
-bitmap => 'question',
-type => 'ok',
);
MainLoop;
Ein bisschen umstaendlicher geht es mit Tk::Dialog:
#! /usr/bin/perl
use strict;
use warnings;
use Tk;
use Tk::Dialog;
my $mw = MainWindow->new();
$mw->Label(-text => 'Dies ist ein Test')->pack();
my $text = "Sind Sie sich sicher mit der Adresse?\nSie haben eine ungueltige E-Mail-Adresse eingegeben";
my $dialog = $mw->Dialog(-title => 'Test',
-text => $text,
-bitmap => 'question',
-default_button => 'ok',
-buttons => ['ok']);
$dialog->Show();
MainLoop;
Das sieht dann so aus:
Wie kann ich vor dem Beenden eines Programms noch was abfragen?
Häufig beendet der Benutzer ein Programm, obwohl die letzten Änderungen noch nicht gespeichert sind. Wird das Beenden nicht abgefangen, werden die letzten Änderungen nicht gespeichert und der Benutzer ärgert sich dann das nächste Mal.
Dieses Problem kann man durch folgenden Code umgehen
#! /usr/bin/perl
use warnings;
use strict;
use Tk;
my $mw = MainWindow->new();
$mw->protocol('WM_DELETE_WINDOW', \&before_exit);
MainLoop;
sub before_exit {
my $b_exit = $mw->messageBox(-message => 'Save all your changes before exit?',
-bitmap => 'question',
-title => 'Test',
-type => "OkCancel",
);
if ($b_exit eq 'ok'){
# save all the changes
}
exit;
} # end before_exit
Das Gleiche mit Tk::Dialog:
#! /usr/bin/perl
use warnings;
use strict;
use Tk;
use Tk::Dialog;
my $mw = MainWindow->new();
$mw->protocol('WM_DELETE_WINDOW', \&before_exit);
MainLoop;
sub before_exit {
my $dialog = $mw->Dialog(-text => 'Save all your changes before exit?',
-bitmap => 'question',
-title => 'Test',
-default_button => 'ok',
-buttons => ['cancel','ok'],
);
my $b_exit = $dialog->Show();
if ($b_exit eq 'ok'){
# save all the changes
}
exit;
} # end before_exit
Der Dialog sieht dann so aus:
Wie kann ich ein eigenes Bitmap benutzen?
In den beiden oberen Dialogen ist links immer ein Fragezeichen zu sehen. Dies ist jedoch nicht immer angebracht. Bei Tk sind 8 Bitmaps "mitgeliefert".
- error
- question
- info
- hourglass
- warnings
- questhead
- gray50
- gray12
Möchte man ein eigenes Bitmap verwenden, so ist dies ohne größere Probleme möglich. Die Bitmaps müssen jedoch im X11 Bitmap format vorliegen (jedenfalls ist mir nicht bekannt, dass man auch andere Formate einbinden kann). Hat man jedoch ein gif-Bild zur Verfügung, so kann man dieses z.B. mit
convert infile.gif outfile.xbm konvertieren.
Zum Einbinden des eigenen Bitmaps muss einfach ein @ vor die Pfadangabe gestellt werden. Beispiel:
#! /usr/bin/perl
use strict;
use warnings;
use Tk;
use Tk::Dialog;
my $mw = MainWindow->new();
my $dialog = $mw->Dialog(-title => 'Test',
-text => 'Save all your changes before exit',
-bitmap => "\@./test.xbm",
-default_button => 'ok',
-buttons => ['cancel','ok']);
$dialog->Show();
MainLoop;
Das sieht dann so aus:
Ergänzungen, Kommentare
Das ganze gibt's auch als pdf:
http://perl.renee-baecker.de/dialog_widget.pdf
ReneeBaecker - 04 Oct 2004 Link zu pdf-Datei
ptk hat mir im Forum noch eine weitere (und schönere) Methode verraten, um eine eigene Grafik zu verwenden:
Mit Hilfe eines Photo-Objekts und mit -image sattt -bitmap.
#! /usr/bin/perl
use strict;
use warnings;
use Tk;
use Tk::Dialog;
my $mw = MainWindow->new();
my $photo = $mw->Photo(-file => './test.bmp');
my $text = 'Save all your changes before exit?';
my $dialog = $mw->Dialog(-title => 'Test',
-text => $text,
-image => $photo,
-default_button => 'ok',
-buttons => ['cancel','ok']);
$dialog->Show();
MainLoop;
und so sieht das ganze dann aus:
ReneeBaecker - 04 Oct 2004 Eigene Grafik verwenden (2. Teil)
Kommentare werden am besten in folgender Form vorgenommen, damit
sie im Inhaltsverzeichnis angezeigt werden (natürlich ohne das <verbatim>):
---+++ Main.??? - 14 Jul 2003 - Betreff