GUI mit Perl/Tk

Perl/Tk - Tipps und Tricks

Inhaltsverzeichnis

Tk-Fenster zentrieren

Code-Beispiel zum Zentrieren des Tk-Fensters:

#!perl

use strict;
use warnings;
use Tk;

my $mw = Tk::MainWindow->new(-title => 'Mein Programm');

# Größe des Fensters:
my      $windowHeight       = 600;
my      $windowWidth        = 800;

# Bildschirmgröße holen:
my      $screenHeight       = $mw->screenheight;
my      $screenWidth        = $mw->screenwidth;

# MamaGUI zentrieren:
$mw->geometry($windowWidth."x".$windowHeight);
$mw->geometry("+" .
                   int($screenWidth/2 - $windowWidth/2) .
                   "+" .
                   int($screenHeight/2 - $windowHeight/2)
                  );

# minimale Größe festlegen:
$mw->minsize(400, 300);

$mw->MainLoop;
exit(0);

zentrierte Perl/Tk-GUI

Tk-Dos-Fenster verstecken

"Dosfenster" der Tk-Anwendung unter Windows verstecken:

use Win32::GUI;

#beim Programmstart:

my ($DOS) = Win32::GUI::GetPerlWindow();
Win32::GUI::Hide($DOS);

#und nach dem MainLoop():

Win32::GUI::Show($DOS);

Bei der Perldistribution von Active-State kann man statt dessen auch das Script mit der mitgelieferten wperl.exe starten, dann erhält man auch kein Dosfenster. Dies lässt sich auch in Verknüpfungen auf der Windowsoberfläche so eintragen.

Wenn man aber nicht dauernd wperl.exe script.pl ausführen möchte, kann man unter WinNT/2000/XP/Vista/7/8/8.1 folgendes machen:

  1. Script in script.ptk umbenennen
  2. in der shell eingeben:
    assoc .ptk=Perl-Tk
    ftype Perl-Tk="c:\perl\bin\wperl.exe" "%1" %*

(eventuell muss der Pfad zur Perlinstallation angepasst werden). Dann klappt's auch ohne wperl vorher (oder z.B. auch mit Doppelklick auf den Dateinamen).

Fenster-Schließen abfangen

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

my $mw = MainWindow->new();
$mw->protocol('WM_DELETE_WINDOW', \&ExitApplication);
MainLoop();

sub ExitApplication {
    # Prepare dialog yes|no
    my $dialog = $mw->Dialog(-text => 'Do you really want to quit?',
                             -bitmap => 'question',
                             -title => 'Quit?',
                             -default_button => 'Yes',
                             -buttons => [qw/Yes No/],
                            );

    my $answer = $dialog->Show(); # and display dialog
    if ($answer =~ /y/i){
        # maybe do some cleaning up and
        exit;
    }
    else {
        # continue
    }

} # sub ExitApplication

Quasiblockieren

$var = 0;
$mw->after(10000, sub { $var = 1 }); # 10 s warten
$mw->waitVariable(\$var);

Waitcursor

Beschäftigung anzeigen mit Stundenglas- / Armbanduhr-Mauscursor. Leider ist nirgendwo so richtig gut beschrieben, wo man die Cursorarten findet. Ich habe einen Tipp gefunden, der mir weitergeholfen hat, und zwar in die Datei ...Perl\site\lib\Tk\X11\cursorfont.h zu gucken. Dort sieht man zumindestens die erlaubten Namen.

my $oc = $Config{text_widget}->cget(-cursor);
$Config{text_widget}->configure(-cursor => 'watch');
# tue etwas zeitaufwändiges
$Config{text_widget}->configure(-cursor => $oc);

Tk-Dosfenster öffnen

Für Active-State-Perl unter Windows: Minimiertes Dosfenster bei Programmstart wieder hochkommen lassen.

my ($DOS) = Win32::GUI::GetPerlWindow();
Win32::GUI::Show($DOS);

Programm im Vollbildmodus ausführen

Spiele werden für gewöhnlich immer Fullscreen ausgeführt, man sieht also keine Fensterleiste und der gesamte Bildschirm wird verwendet. In Perl/Tk kann das durch die Option FullScreen bewirkt werden. packPropagate(0) verhindert, dass das Packen von Widgets auf das MainWindow die Größe der Fensterfläche nicht wieder reduziert.

#!perl

use strict;
use warnings;
use Tk;

my $mw = Tk::MainWindow->new(-bg => 'white');

$mw->bind('all' => '<Key-Escape>' => sub {exit;});
$mw->FullScreen(1);
$mw->packPropagate(0);

$mw->Label(-text => 'Hinweis: Escape-Taste drücken, um den Vollbildmodus zu verlassen.')->pack;

$mw->MainLoop;
exit(0);

Fenstergröße festlegen

Manchmal möchte man die Dimensionen des MainWindow / Toplevel festlegen. Das geht auf verschiedene Arten. Eine minimale Größe kann genauso angegeben werden (minsize()), wie eine maximale Größe (maxsize()). Alternativ kann die Fenstergröße zum Programmstart über (geometry()) spezifiziert werden. Das Fenster kann dann nachträglich durch den Nutzer vergrößert oder verkleinert werden. Es ist auch möglich, die Größenänderung zu unterbinden. Das kann durch den Befehl resizable(x,y) gesteuert werden, der definiert, in welcher Richtung das Fenster seine Größe verändert darf. So kann beispielsweise die vertikale Größenänderung zwar zugelassen, die horizontale aber unterbunden werden.

Beispiel für initiale, vordefinierte Fenstergröße mit geometry(). Das Fenster muss bei Verwendung von geometry() nicht durch packPropagate(0) vor Größenänderungen geschützt werden. Hier sieht man auch, wie man die Größe des Fensters ausliest, sowie die Größe des Desktops.

#!perl

use strict;
use warnings;
use Tk;

my $mw = Tk::MainWindow->new(-bg => 'white');

my $breite = 640;
my $hoehe = 480;
$mw->geometry($breite . 'x' . $hoehe);
$mw->update; # sonst stimmen width() und height() nicht

$mw->Label(
	-text => 'packPropagate(0) ist bei geometry nicht mehr notwendig',
)->pack;
$mw->Label(
	-text => sprintf('Dieses Fenster ist %s Pixel breit und %s Pixel hoch.', 
        $mw->width, $mw->height),
)->pack;
$mw->Label(
	-text => sprintf('Der Desktop ist %s Pixel breit und %s Pixel hoch.', 
    	$mw->screenwidth, $mw->screenheight),
)->pack;

$mw->MainLoop;
exit(0);

MainWindow mit festgelegter Größe

Beispiel für Untergrenze der Fenstergröße durch minsize():

#!perl

use strict;
use warnings;
use Tk;

my $mw = Tk::MainWindow->new(-bg => 'white');
$mw->minsize(150, 150);

$mw->Label(-text => 'Kleiner geht\'s nicht')->pack;
$mw->Label(-text => 'Größer schon')->pack;

$mw->MainLoop;
exit(0);

MainWindow mit minimaler Größe

Beispiel für die Begrenzung der maximalen Fenstergröße mit maxsize():

#!perl

use strict;
use warnings;
use Tk;

my $mw = Tk::MainWindow->new(-bg => 'white');
$mw->maxsize(300, 200);

$mw->Label(-text => 'Größer geht\'s nicht')->pack;
$mw->Label(-text => 'Kleiner schon')->pack;

$mw->MainLoop;
exit(0);

MainWindow mit Restriktion in der Fenstergröße

Literatur und Quellen

  1. Einige Inhalte wurden mit freundlicher Genehmigung von Christian Dühl von dessen Webseite duehl.de übernommen.
  2. Mastering Perl/Tk: Graphical User Interfaces in Perl, Kapitel 11.5. Toplevel Methods

Top