Zurück | Übersicht | Weiter

Kapitel 3 : Das erste Fenster

Das ist das berüchtigte minimale Beispiel für wxPerl. Es öffnet lediglich ein kleines, leeres Fenster. Schau dir das Beispiel erstmal in Ruhe an und versuch es zu verstehen.

servus_wx.pl
use strict;
use warnings;

package ServusWelt; 
use Wx;                                     # Wx einbinden 
use base qw(Wx::App);                       # von Wx::App ableiten  
sub OnInit {
    my $app =  shift ;
    my $frame = Wx::Frame->new(
                              undef,         # kein Eltern-Fenster
                              -1,            # Fenter id
                              'Servus Welt', # Titel
                              [-1, -1],      # Position x/y
                              [150, 150]     # Größe x/y
    );
    $app->SetTopWindow($frame);              # Fenster als oberstes bestimmen
    $frame->Show(1);                         # Fenster zeichnen
    1;
}

package main;
ServusWelt->new->MainLoop;                   # Programminstanz erzeugen und starten

die einzelnen Befehle

Das "use strict" und "use warnings" kann man als "sei brav und ordentlich" verstehen und "use Wx" sorgt dafür das WxPerl geladen wird. Und keine Sorge, Wx läd wirklich nur einige Kernklassen und nicht alles was mit WxPerl installiert wurde. Das folgende ist weniger einfach, denn in WxPerl kann man nicht einfach sagen: "mach mir ein Fenster". Das wäre zwar schön und es gibt bereits Bestrebungen das mit Wx zu erreichen, aber noch brauche ich vorher ein Wx-Programm, daß für dieses Fenster verantwortlich ist.

Das hat einmal damit zu tun, das WxWidgets in C++ geschrieben ist und sehr streng objektorientiert ist. Und da WxPerl nur eine dünne Schicht um WxWidgets bildet muss man vieles genauso machen wie man es in C++ machen würde.

veränderte Ablaufkontrolle

Der andere Grund dafür ist, daß ein graphisches Programm anders abläuft als ein Script auf der Kommandozeile. Hier bestimmt der Benutzer wann was geschieht, indem er Knöpfchen drückt. Das Programm hat auf solche Ereignisse zu reagieren und die Funktionen zu starten, die der Programmierer dafür vorgesehen hat. Folglich muß der Programmierer auch etwas Kontrolle an Wx abgeben, daß darüber wacht das jederzeit das passende Ereignis (Event) ausgelöst wird.

Ein Zweck von Wx ist es, einem graphischen Benutzerprogramm (auch Applikation kurz App genannt) eine solche standardisierte Maschinerie bereitzustellen. "use base qw(Wx::App);" holt sich die Maschinerie ab und macht das "package ServusWelt" damit zu einem Bauplan für ein Wx-Programm , der nur noch um die Funktionen erweitert wird, die bei uns besonders sind. Das abschliessende "ServusWelt->new->MainLoop;" erzeugt eine Maschine nach dem Bauplan und startet sie. Beendet wird das Programm natürlich vom Benutzer.

Initialisierungsphase

Vor dem Start unseres Programmes, (beim initialisieren) wird die Methode "OnInit" aufgerufen. Hier können wir eintragen, daß wir gerne ein Fenster (engl. Frame) hätten, daß so und so gross ist und folgenden Text im Titel trägt. Da dieses Fenster keine Eltern hat, bleibt der erste Parameter "undef" und da wir hier noch nicht mit ID's rumspielen, sagen wir beim zweiten Parameter mit "-1" Wx soll einfach eine automatisch vergeben. (Die -1 bedeutet in Wx fast immer: "Mach was du für richtig hälst, ich will mich nicht drum kümmern." ) Der folgende Befehl stellt sicher, daß unser Fenster über alle anderen plaziert wird und das "Show" ist natürlich der Befehl, dieses Fenster tatsächlich anzuzeigen, aber nur wenn der Parameter (die "1") positiv (nicht 0) ist. Auch wenn "Show" meist einen positiven Rückgabewert gibt so stellt doch die letzte 1; sicher das OnInit {} einen positiven Rückgabewert besitzt und die App nicht vorzeitig abgebrochen wird.

Mit einigen Kniffen und Ahnung von Perl lässt sich dies ganze noch etwas abkürzen.

servus_kurz.pl

use strict; 
use warnings;

ServusWelt->new->MainLoop;               # Programminstanz erzeugen und starten

package ServusWelt; 
use base qw(Wx::App);                    # von Wx::App ableiten 
use Wx;                                  # Wx einbinden
sub OnInit { Wx::Frame->new( undef, -1 , 'Servus Welt', [-1 , -1], [150 , 150] )->Show(1) } 

Und sogar das ", [-1, -1], [150, 150]" ließe sich noch weglassen.


Zurück | Übersicht | Weiter

-- HerbertBreunung - 19 Aug 2005
Topic revision: r25 - 2009-08-15 - 19:54:08 - HerbertBreunung
 
Bitte die NutzungsBedingungen beachten.
Bei Vorschlägen, Anfragen oder Problemen mit dem PerlCommunityWiki bitten wir um WebBottomBarExample">Rückmeldung.