Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Introduzione a PHP-GTK

Come creare applicazioni con interfacce grafiche in PHP utilizzando le librerie GTK
Come creare applicazioni con interfacce grafiche in PHP utilizzando le librerie GTK
Link copiato negli appunti

PHP-GTK, è un'estensione che permette di
sfruttare le librerie grafiche GTK+ attraverso PHP. Questa estensione prevede
un'interfaccia di tipo object-oriented alle classi ed alle funzioni GTK, offrendo
la possibilità di scrivere applicazioni client-side in poco tempo.
Andrei Zmievski, uno dei creatori di PHP e creatore di questa estensione,
ha scelto proprio GTK+ per fornire agli utenti finali applicazioni cross-platform
e con un alto livello di professionalità.

Anche se ormai lo sviluppo di questa estensione è fermo alla versione
0.5.2 da ormai quasi un anno, Andrei assicura che il progetto è stato
accantonato solo per fare spazio allo sviluppo del nuovo ZendEngine. Dopo
l'uscita della versione definitiva di PHP5 lo sviluppo derrà ripreso
da dove è stato interrotto.

Attualmente PHP-GTK non viene utilizzato molto dagli sviluppatori, soprattutto
perchè ancora in beta e non completamente documentato. Potete comunque
scaricare molti progetti interessanti dal sito ufficiale di PHP-GTK
. Dal sito potrete recuperare anche i files sorgenti per l'installazione sotto
windows e linux, la documentazione ufficiale (da teneresmepre sottocchio)
e altre informazioni utili sul progetto.

Per affrontare tutte le problematiche e le opportunità forniteci da
PHP-GTK non ci limiteremo ad un solo articolo. In futuro cercheremo di offrirvi
approfondimenti su argomenti specifici che qui scalfiremo solamente.

L'installazione

L'installazione di PHP-GTK è un'operazione molto semplice. Di seguito
spiegherò come eseguirla sotto windows.Potete comunque reperire ulteriori
informazioni dalla documentazione
ufficiale
.

Per installare l'estensione possiamo seguire due vie:

  • La prima consiste nell'utilizzare degli installer, applicativi che permetteranno
    di installare PHP-GTK sotto windows seguendo pochi e semplici passi; oltretutto
    gli installer forniscono funzioni aggiuntive particolari, come la possibilità
    di eseguire, con un semplice doppio click, i file .dgtk e .pgtk contenenti
    il nostro codice PHP, ed una vasta gamma di esempi.
  • La seconda consiste nel prelevare il codice in formato binario dal sito
    di PHP-GTK ed eseguire l'installazione manualmente.

Non tratto, volontariamente, dell'installazione partendo dal codice sorgente,
visto che risulta utile solo per poche persone.

Per quanto riguarda la prima opzione, possiamo prelevare uno dei seguenti
installer:

Una volta scaricati, basterà avviare l'eseguibile per installare il
tutto. Notate che NON è necessario possedere un'installazione di PHP
funzionate sul proprio sistema operativo e neppure un server web. Consiglio
caldamente di non sovrascrivere i file della vostra installazione iniziale
di PHP, se presente. Scegliete semplicemente una cartella differente.

A installazione avvenuta potrete sperimentare fin da subito alcune delle
potenzialità di PHP-GTK testando gli esempi già inclusi. Come potete notare,
ora è possibile eseguire i file .dgtk e .pgtk con un semplice doppio
click. La differenza tra i due tipi di file sta nel fatto che il primo viene
eseguito in versione DEBUG, visualizzando il prompt dei comandi in cui sarà
catturato l'output stampato dalle funzioni standard di stampa di PHP, mentre
il secondo verrà eseguito tramite php_win.exe, che non visualizza questo
prompt.

Gli installer, oltre ad installare PHP-GTK aggiungeranno anche alcune estensioni
utili durante lo sviluppo di determinate applicazioni. Se necessitate ulteriori
estensioni, potete decidere di prelevarle dalla cartella extensions della
distribuzione di PHP presente e copiarle nella cartella apposita della distribuzione
di PHP-GTK (quella contenete le altre estensioni), oppure potete far visita
al sito www.kromann.info, dal quale,
nella sezione PHP, potrete recuperare tutte le estensioni gratuite aggiornate
all' ultima versione.

Per quanto riguarda l'installazione della versione binaria, vi basterà
seguire questi tre semplici passi:

  • Scompattate il file scaricato, e copiate il contenuto della cartella "php4"
    all'interno della cartella c:php4. In caso questa contenga già un'installazione
    di PHP, non ci dovrebbero essere problemi in caso di sovrascrittura. Difatti
    la struttura del file php.exe della distribuzione di PHP e quella di PHP-GTK
    dovrebbero coincidere. In caso non vogliate sovrascrivere una cartella già
    esistente, vi consiglio di utilizzare un'installer, per semplificarvi il
    lavoro.
  • copiate il contenuto della cartella "winnt" in c:winnt in caso
    utilizziate windows NT o windows 2000, altrimenti all'interno di c:windows;
    in caso sia già presente il file php.ini all'interno della vostra
    cartella di sistema, non è necessario che lo sovrascriviate. Dovete
    solamente apportargli le modifiche elencate nel file php.ini-gtk, presente
    nella cartella "php4".
  • copiate il contenuto della cartella test nella cartella in cui volete
    si trovino i vostri script.

Per testare il corretto funzionamento dell'installazione digitate, nel prompt
dei comandi, la seguente linea di codice, ricordandovi di modificare i path
assoluti in caso abbiate installato il prodotto in cartelle differenti da
quelle standard:

c:php4php c:php4testhello.php

In caso non vogliate visualizzare la finestra di prompt, utilizzate:

c:php4php_win c:php4testgtk.php

Un po' di teoria

Conoscere la teoria, prima di dedicarsi alla pratica, è sempre una
buona prassi da seguire. Per questo motivo vi elencherò, spiegandovele,
una serie di parole chiave che utilizzeremo spesso in questi e nei futuri
articoli:

  • Widget: widget è semplicemente un nome comune
    tramite il quale vengono indicati i componenti che compongono (scusate il
    gioco di parole) un'interfaccia grafica, più comunemente chiamata
    GUI (Graphical User Interface). Un bottone, una finestra, una barra di scorrimento,
    sono tutti esempi di widget. Essendo un widget qualcosa di generico, indicheremo
    con widget anche quei componenti (non visibili direttamente) atti a contenere
    altri widget. Questi componenti sono più comunemente chiamati Containers
    e vengono spesso sfruttati per raggruppare tra loro più widget al
    fine di disporli correttamente sullo schermo.
  • Signal (Segnale): un segnale è una notifica effettuata
    da un widget, è un modo tramite il quale un componente indica al
    GUIengine che il suo status è stato modificato in qualche modo. Quando
    clicchiamo su un bottone, quando chiudiamo o ridimensioniamo una finestra
    il widget modificato ci informerà delle modifiche avvenute tramite
    un segnale. GTK+ differenzia molto i segnali dagli eventi
    : un evento è una notifica utilizzata tra i widget ed il GUIengine
    per comunicare. Gli eventi e la loro gestione verranno approfonditi in futuro.
  • Callback: ogni qualvolta un widget emette un segnale,
    viene eseguita, se presente, una funzione connessagli precedentemente. Questa
    funzione, scelta e connessa dal programmatore, è detta callback.
    Per fare un esempio concreto, potremmo associare al segnale evocato in caso
    di click su un bottone, una funzione che ci permetta di visualizzare un
    messaggio. Le callback funzionano in modo simile agli handler di una state-machine.

Come già anticipato per programmare in PHP-GTK è fondamentale
conoscere il funzionamento della programmazione ad oggeti. Difatti, come in
tutti i GUIengine, anche i wrapper di PHP-GTK fa largo uso di ereditarietà
e polimorfismo per permettere una gestione più agevolata dei widget.
Un piccolo esempio: ogni widget, sia esso finestra, bottone o altro, eredita
da una classe base, chiamata GtkWidget
che contiene tutte le proprietà ed i metodi comuni ad ogni componente.
In questo modo, sia che si lavori su un'istanza di GtkWindow,
sia che si lavori su un'istanza di GtkButton,
sarà sempre possibile richiamare il metodo GtkWidget::hide()
per nascondere il componente. Molte classi base, come GtkWidget, sono di tipo
astratto, e quindi non possono essere istanziate direttamente, ma solo ereditate.
Come potete vedere il concetto di ereditarietà risulta qui fondamentale,
ed è necessario averne compreso appieno il funzionamento.

Prima di iniziare

Lo scopo di questo e degli articoli futuri, oltre a quello di introdurvi
alla programmazione stand-alone con PHP, è anche quello di preparare
una serie di librerie e programmi che potrebbero essere più o meno
utili in futuro.

La semplice libreria che creeremo ora conterrà una classe per la gestione
delle nostre applicazioni PHP-GTK. Segue il codice della libreria, che salveremo
nel file gtk_application.lib:

<?php

/*NOTA: gli script PHP-GTK devono iniziare con <?php anziche con <?
*/

class GtkApplication{

/*il costruttore della classe: al momento richiama solamente una funzione
interna che serve per inizializzare la libreria*/

function GtkApplication(){

$this->init();

}

function init(){

if(! class_exists('gtk')){

$ext = (strtolower(substr(PHP_OS, 0, 3)) == 'win' ) ? 'dll' : 'so' ;

dl('php_gtk.'.$ext) or die('Impossibile inizializzare la libreria php_gtk.'.$ext);

}//endif

}//end of init

function set_main($gtk_window){

$gtk_window->connect_object('destroy', array('gtk', 'main_quit'));

}//end of set_main

function main_loop(){

gtk::main();

}//end of main_loop

/*Semplice funzione che serve a restituire la callback da usare
in caso di uscita dal programma.*/

function destroy(){

return array('gtk', 'man_quit');

} //end of destroy
}//end of GtkApplication

$app = new GtkApplication();

return($app);

?>

Analizzando questa semplice classe, possiamo ottenere varie informazioni
da tenere in considerazione:

  • Comincio con la meno importante: l'utilizzo di return() alla fine dello
    script permette di restituire un valore quando il nostro file viene incluso.
    In questo modo permetteremo l'inzializzazione di PHP-GTK e della classe
    GtkApplication in modo molto compatto, sfruttando questa sintassi:

    $myApp = require_once('gtk_application.lib');

    Una sintassi del genere non è obbligatoria, potremmo anche inizializzare
    la classe manualmente usando

    $myapp = new GtkApplication;

  • Il codice PHP-GTK DEVE necessariamente essere incluso tra i tag <?php
    e ?>
  • è necessario eseguire un controllo che ci permetta di sapere se
    l'estensione per PHP è stata caricata correttamente, ed in caso contrario,
    caricare la libreria corretta in base al sstema operativo. Questo viene
    fatto controllando che esista la classe gtk (classe principale per il funzionamento
    delle nostre applicazioni stand-alone) ed in caso negativo, caricando la
    libreria opportuna tramite dl()
    . La funzione dl(),
    in questo caso, non darà problemi anche se eseguita su sistemi operativi
    multithread (windows NT, 2000, XP).
  • la funzione set_main accetta come parametro l'istanza di una classe che
    funge da finestra principale. A questa finestra viene connessa una callback,
    richiamata nel momento in cui il widget notificherà un segnale di
    tipo destroy. La funzione, metodo della classe gtk, si occupa di chiudere
    l'intero GUIengine, terminando, di fatto, l'applicazione in memoria.
    Potete notare come è semplice assegnare una callback ad un segnale:
    basta richiamare il metodo GtkObject::connect()
    che accetta come argomenti obbligatori una stringa che rappresenta il segnale
    ed un'altra che rappresenta la funzione da richiamare e, opzionalmente,
    un parametro conetente dei dati che verranno passati come ultimo argomento
    della callback.
    GTK permette di associare più di una callback ad un segnale: chiamate
    successive a GtkObject::connect()
    o a funzioni simili, semplicemente aggiungeranno la callback indicata ad
    una lista contenete le funzioni da richiamare al momento della notifica
    del segnale. Per poter sostituire una callback precedentemente caricata,
    dovrete prima richiamare GtkObject::signal_handlers_destroy()
    che svuota la lista delle callback registrate.
    Le funzioni di connessione delle callback restituiscono un ID che può
    essere usato come parametro per eventuali funzioni di gestione dei segnali,
    cioè le funzioni GtkObject::signal_handlers_*. Per ora non tratterò
    questo argomento.
    Nella libreria ho utilizzato una variante di connect:
    GtkObject::connect_object
    a cui ho passato, come secondo parametro,
    un'array contenete due valori: il primo una stringa con il nome di una classe,
    ed il secondo un'altra stringa contenete il nome del metodo della classe
    che vogliamo richiamare al momento della notifica.
  • La funzione gtk::main()
    DEVE essere chiamata alla fine del nostro script perché; avvia GTK
    permettendoci di visualizzare tutti i widget creati in precedenza.
  • Una precisazione: la funzione destroy è stata aggiunta per facilitare,
    in futuro, il recupero di un'unica funzione per la chiusura della nostra
    applicazione.

Ti consigliamo anche