Applicatie-ontwikkeling met PHP-GTK (juni 2003)

PHP-GTK is een extensie die het mogelijk maakt om PHP te implementeren in de GTK-Toolkit.

Die Toolkit is een multi-platform omgeving, waar je Graphical User Interfaces (GUI’s) mee kunt maken. Meer informatie over GTK vindt je op http://www.gtk.org. De extensie PHP-GTK is te downloaden op http://gtk.php.net.

In deze tutorial zal ik wat kleine voorbeeldjes maken, die ik stap voor stap uitleg. Verwacht van mij geen wonderen, ik werk er pas 2 dagen mee en ken dus ook nog lang niet alle mogelijkheden. In de tutorial ga ik uit van een Windows-installatie (en nee dat is geen discriminatie J , de applicaties zouden het in een X-Windows omgeving ook gewoon moeten doen).

Daarnaast verwacht ik toch wel een beetje kennis van OO, aangezien PHP-GTK voor een groot deel gebaseerd is op classes en methods. Begin hier dus echt niet aan als je de basiskennis van PHP en OOP niet in huis hebt.

Applicaties die je ontwikkeld in PHP-GTK kun je NIET gebruiken op je website. Het heeft in veel opzichten iets weg van Java, echter Java kun je vaak ook als applet gebruiken, PHP-GTK dus niet. PHP-GTK heeft niets te maken met je webserver.

Mijn ontwikkel-omgeving :

De installatie van PHP-GTK is vrij eenvoudig. Download de laatste stabiele versie. Hij beschikt over een eigen PHP-Parser, mocht je dus al een bestaande PHP-installatie hebben, raad ik je aan om PHP-GTK in een andere directory uit te pakken. Laat de php.ini ook gewoon in diezelfde directory staan. Ik heb zelf een bestaande PHP installatie in C:\PHP staan, de PHP-GTK heb ik uitgepakt naar C:\PHP4.

Het aanroepen van de parser gaat als volgt :

C:\PHP4\PHP_WIN PAD\NAAR\SCRIPT.PHP

Nu is dit iedere keer een hoop typwerk als je wilt testen, in HTML-kit (nog steeds mijn favo editor) kun je een lijst van externe programma’s bijhouden. Ik heb php_win.exe aan die lijst toegevoegd, en er een sneltoets aan gehangen. Als ik op CTRL + 1 druk wordt het bestand meteen geparsed door php_win. Dit werkt een heel stuk sneller.

PHP-GTK installatie testen

Voordat je kan gaan starten, is het handig om te weten dat je installatie werkt. Je kunt je installatie testen door het bestand ‘gtk.php’ aan te roepen :

c:\php4\php_win.exe c:\php4\test\gtk.php

Je krijgt dan een venster dat er ongeveer zo uit ziet :

 

Werkt dat? Mooi he!

Gefeliciteerd, je hebt zojuist PHP-GTK succesvol geïnstalleerd.

Je eerste applicatie

<?
/*
Het importeren van de juiste GTK module, voor zowel Windows als Linux
*/
if (!class_exists('gtk')) {
  if (
strtoupper(substr(PHP_OS03)) == 'WIN') { 
       
dl('php_gtk.dll'); 
  } else {
       
dl('php_gtk.so'); 
  }
}

/* Nieuw window aanmaken */
$window = &new GtkWindow(); 

/* Alles in het window laten zien */
$window->show_all();

/* Gtk programma starten */
Gtk::main();
?>

Het eerste stukje van dit bestand importeerd de juiste GTK-module. Er wordt gekeken naar de omgevingsvariabele PHP_OS, als hier ‘WIN’ in voorkomt wordt de windows-module geladen en anders de *nix-module.

Daarna maken we een nieuwe instantie van de class GtkWindow aan. Al de verschillende classes vindt je terug in de Reference op http://gtk.php.net/manual/en/reference.php.

De functie show_all() zorgt ervoor dat alle elementen in het window zichtbaar worden.

Als laatste wordt Gtk::main() aangeroepen, dit is het startcommando voor de GTK-module.

Bovenstaande code levert de volgende uitvoer:

Tweede applicatie : Geef de boel wat smoel

<?
/*
Het importeren van de juiste GTK module, voor zowel Windows als Linux
*/
if (!class_exists('gtk')) {
  if (
strtoupper(substr(PHP_OS03)) == 'WIN') {
    
dl('php_gtk.dll');
  } else {
    
dl('php_gtk.so');
  }
}

/* Nieuw window aanmaken */
$window = &new GtkWindow();

/* Window een titel geven */
$window->set_title('My first PHP-GTK');

/* Window standaard maten meegeven */
$window->set_default_size(400,100);

/* Frame in het window maken */
$frame = &new GtkFrame('GTK-Frame');
$window->add($frame);

/* V(ertical)Box aanmaken waarin elementen kunnen worden gezet. */
$box1 = &new GtkVBox();
$frame->add($box1);
$box1->show();

/* Buttonbox invoegen */
$box2 = &new GtkHButtonBox();
$box2->set_layout(GTK_BUTTONBOX_SPREAD);
$box1->add($box2);
$box1->show();

/* Knop toevoegen aan de button-box */
$button = &new GtkButton('Knop');
$box2->pack_start($button);
$button->show();

/* Alles in het window laten zien */
$window->show_all();

/* Gtk programma starten */
Gtk::main();
?>

 

De uitvoer van dit programma ziet er als volgt uit :

Het starten van het programma blijft hetzelfde : Eerst de GTK-module laden. Daarna een nieuwe instantie van GtkWindow maken.

Vervolgens roepen we de functies set_title() en set_default_size() aan. Die 2 spreken voor zich.

set_title() zet de titel in de blauwe balk.

set_default_size() bepaald de startmaten van het window.

Daarna voegen we een zogenaamd "frame" in. Je kunt zo’n frame vergelijken met <FIELDSET> in HTML. Dit frame is meteen schermvullend, alle volgende elementen moeten we dus toevoegen aan het frame. Het frame wordt aan het window toegevoegd met de functie add().

Het gedeelte dat hierna volgt is wat ingewikkelder. Het positioneren van elementen in GTK is (volgens mij) een zwak punt. Om een button mooi uit te laten komen moet je deze in een "Buttonbox" plaatsen. Wat als je een button gewoon toe zou voegen aan het frame, op deze manier:

<?
$button 
= &new GtkButton(‘Te groot’);
$frame->add($button);
?>

Deze button vult meteen het hele window, dat ziet er echt niet uit :

Dus, buttonboxes gebruiken. Er zijn horizontale (GtkHButtonbox) en verticale (GtkVButtonbox).

Van een buttonbox kun je de layout wijzigen met de functie set_layout. Er zijn 3 opties :

BUTTON_BOX_START

BUTTON_BOX_SPREAD

BUTTON_BOX_END

 

Met de functie pack_start() voeg je een element toe aan een buttonbox.

Een andere manier van positioneren kun je bereiken met een tabel. Zo’n tabel heeft ook een eigen class, GtkTable. Het gebruik van zo’n tabel is wat anders als je gewend bent met HTML, maar het principe blijft hetzelfde.

 

Een menubar…da’s pas bar!

Hetgeen je applicatie absoluut niet mag missen is een menubar, je moet op de een of andere manier door je programma kunnen navigeren en het op een elegante manier kunnen afsluiten. PHP-GTK heeft dat natuurlijk, in de class GtkMenuBar:

Om een volledig menubar te kunnen maken is het belangrijk dat je de hierarchie kent :

GtkMenuBar()

GtkMenuItem()

GtkMenu()

GtkMenuItem()

Je begint dus met GtkMenuBar(), hiermee geef je aan dat je een menubar wilt hebben. Daarna geef je de hoofd-items van de bar aan, daarvoor gebruik je GtkMenuItem(). Onder de hoofditems komt het daadwerkelijke menu, dit zijn ook GtkMenuItems, echter gegroepeerd door GtkMenu().

<?
if (!class_exists('gtk')) {
  if (
strtoupper(substr(PHP_OS03)) == 'WIN') { 
    
dl('php_gtk.dll'); 
  } else {
    
dl('php_gtk.so'); 
  }
}

function 
destroy(){
  
Gtk::main_quit();
}

/* Nieuw window starten */
$window = &new GtkWindow();
$window->set_title('Test met menubars');
$window->set_default_size(350,150);
$window->connect('destroy','destroy');

/* Verticale box aanmaken */
$box = &new GtkVbox();
$window->add($box);

/* Menubar aanmaken in de box */
$mnuBar = &new GtkMenuBar();
$box->pack_start($mnuBarfalsefalse0);

/* Hoofditems van de menubar */
$mnuItem1 = &new GtkMenuItem('Menu 1');
$mnuBar->append($mnuItem1);
$mnuItem2 = &new GtkMenuItem('Menu 2');
$mnuBar->append($mnuItem2);

/* Menugroep aanmaken */
$mnuGroep1 = &new GtkMenu();

/* Items in de groep */
$mnuSub1 = &new GtkMenuItem('Subje...');
$mnuSub2 = &new GtkMenuItem('Foo...');
$mnuSep = &new GtkMenuItem();
$mnuSep->set_sensitive(false);
$mnuGroep1->append($mnuSub1);
$mnuGroep1->append($mnuSep);
$mnuGroep1->append($mnuSub2);

/* Groep aan een hoofditem hangen */
$mnuItem1->set_submenu($mnuGroep1);

$window->show_all();
Gtk::main();
?>

Dit programma geeft de volgende uitvoer :

Het lijkt al heel wat. Hier de stappen in het kort: