Also ich hab vor noch nicht allzu langer Zeit angefangen mich mit PHP-GTK zu befassen, aber mehr als "Hello World" hab ich nicht gefunden im Internet, da hab ich mir gedacht schreib doch selbst eins......na ja hier das Ergebnis, würde mich über verbesserungsvorschläge freuen.....
Beispiel: Rechenprogramm
Meistens beginnt man, wenn man eine Programmiersprache erlernt, mit „Hallo Welt“, da „Hallo Welt“ schon oft genug im Internet vorhanden ist, handelt diese Übung von einem kleinen Rechenprogramm.
Da es in diesem Tutorial um PHP-GTK geht, wird vorausgesetzt, dass man bereits Erfahrung mit PHP hat.
In dieser Übung wird ein Rechenprogramm mit den grundlegenden Funktionen Addition, Subtraktion, Multiplikation, Division und Modulo erklärt.
Zunächst werde ich das komplette kommentierte Programm auflisten, danach werden die einzelnen Zeilen erklärt.
Datei „rechnen.php“: PHP-Code:
<?
if(!class_exists('gtk')){
if(strtoupper(substr(PHP_OS, 0,3) == 'WIN'))
dl('php_gtk.dll'); //Klasse unter Windows
else
dl('php_gtk.so'); //Klasse unter allen anderen Betriebssystemen
}
function delete_event(){
return false;
}
function shutdown(){ //Wenn das Programm beendet werden soll
print('Wird beendet'); //Gibt den Text 'Wird beendet' im Konsolenfenster aus
gtk::main_quit();
}
function fehler($message){ //Erzeugt eine Fehlermeldung mit dem im Parameter übergebenen Text
$error_win = &new GtkWindow(); //erzeugt ein neues Fenster, in dem die Fehlermeldung ausgegeben wird
$error_win->set_title("Fehler!"); //erstellt den Text 'Fehler!' in der Titelleiste
$error_label = &new GtkLabel($message); //erstellt ein Label mit dem im Parameter übergebenen Text
$error_win->add($error_label); //Fügt das Label dem erzeugten Fenster hinzu
$error_win->show_all(); //macht das Fenster und seine Komponenten sichtbar
}
function get_ergebnis($zahl1, $zahl2, $aktion, $erg){ //gibt die Rechenoperation und das Ergebnis am Bildschirm aus
$erg_win = &new GtkWindow(); //erstellt ein neues Fenster
$erg_win->set_title("Ergebnis"); //erstellt den Text 'Ergebnis' in der Titelleiste
$erg_label = &new GtkLabel($zahl1." ".$aktion." ".$zahl2." = ".$erg); //erstellt ein Label mit der Rechenoperation und dem Ergebnis
$erg_win->add($erg_label); //fügt das Label dem Fenster hinzu
$erg_win->show_all(); //macht das Fenster und seine Komponenten sichtbar
}
function plus($zahl1, $zahl2){ //Funktion zur Addition zweier Zahlen
if(is_numeric($zahl1) && is_numeric($zahl2)){ //Prüft ob die eingegebenen Zahlen numerisch sind
$ergebnis = $zahl1 + $zahl2; //addiert die zwei Zahlen und speichert das Ergebnis
$erg = get_ergebnis($zahl1, $zahl2, '+', $ergebnis); //ruft die Funktion get_ergebnis(zahl1, zahl2, aktion, ergebnis) auf
}else{
fehler("Sie müssen 2 Numerische Werte eingeben"); //ruft die Funktion Fehler(fehlermeldung) auf
}
}
function minus($zahl1, $zahl2){ //Funktion zur Subtraktion zweier Zahlen
if(is_numeric($zahl1) && is_numeric($zahl2)){ //Prüft ob die eingegebenen Zahlen numerisch sind
$ergebnis = $zahl1 - $zahl2; //subtrahiert die zwei Zahlen und speichert das Ergebnis
$erg = get_ergebnis($zahl1, $zahl2, '-', $ergebnis); //ruft die Funktion get_ergebnis(zahl1, zahl2, aktion, ergebnis) auf
}else{
fehler("Sie müssen 2 Numerische Werte eingeben"); //ruft die Funktion fehler(fehlermeldung) auf
}
}
function mal($zahl1, $zahl2){ //Funktion zur Multiplikation zweier Zahlen
if(is_numeric($zahl1) && is_numeric($zahl2)){ //Prüft ob die eingegebenen Zahlen numerisch sind
$ergebnis = $zahl1 * $zahl2; //multipliziert die zwei Zahlen und speichert das Ergebnis
$erg = get_ergebnis($zahl1, $zahl2, '*', $ergebnis); //ruft die Funktion get_ergebnis(zahl1, zahl2, aktion, ergebnis) auf
}else{
fehler("Sie müssen 2 Numerische Werte eingeben"); //ruft die Funktion fehler(fehlermeldung) auf
}
}
function durch($zahl1, $zahl2){ //Funktion zur Division zweier Zahlen
if(is_numeric($zahl1) && is_numeric($zahl2)){ //Prüft ob die eingegebenen Zahlen numerisch sind
$ergebnis = $zahl1 / $zahl2; //dividiert die zwei Zahlen und speichert das Ergebnis
$erg = get_ergebnis($zahl1, $zahl2, '/', $ergebnis); //ruft die Funktion get_ergebnis(zahl1, zahl2, aktion, ergebnis) auf
}else{
fehler("Sie müssen 2 Numerische Werte eingeben"); //ruft die Funktion fehler(fehlermeldung) auf
}
}
function modulo($zahl1, $zahl2){ //Funktion zur Berechnung des Modulos zweier Zahlen
if(is_numeric($zahl1) && is_numeric($zahl2)){ //Prüft ob die eingegebenen Zahlen numerisch sind
$ergebnis = $zahl1 % $zahl2; //berechnet den Modulowert zweier Zahlen und speichert das Ergebnis
$erg = get_ergebnis($zahl1, $zahl2, '%', $ergebnis); //ruft die Funktion get_ergebnis(zahl1, zahl2, aktion, ergebnis) auf
}else{
fehler("Sie müssen 2 Numerische Werte eingeben"); //ruft die Funktion fehler(fehlermeldung) auf
}
}
function get_zahl1($aktion){ //Funktion zur Abfrage der ersten Zahl, Übergabe der Aktion
global $txt_zahl1; //globalisiert das erste Textfeld
$zahl1 = $txt_zahl1->get_text(); //holt den Wert des ersten Textfeldes und speichert das Ergebnis in die Variable $zahl1
get_zahl2($zahl1, $aktion); //ruft die Funktion get_zahl2(zahl1, aktion)
}
function get_zahl2($zahl1, $aktion){ //Funktion zur Abfrage der zweiten Zahl, Übergabe der ersten Zahl und der Aktion
global $txt_zahl2; //globalisiert das zweite Textfeld
$zahl2 = $txt_zahl2->get_text(); //holt den Wert des zweiten Textfeldes und speichert das Ergebnis in die Variable $zahl2
if($aktion == 'plus'){ //prüft welche aktion gewählt wurde und ruft die entsprechende Funktion auf
$akt = plus($zahl1, $zahl2); //eine switch-case Anweisung wäre auch möglich gewesen
}elseif($aktion == 'minus'){
$akt = minus($zahl1, $zahl2);
}elseif($aktion == 'mal'){
$akt = mal($zahl1, $zahl2);
}elseif($aktion == 'durch'){
$akt = durch($zahl1, $zahl2);
}elseif($aktion == 'modulo'){
$akt = modulo($zahl1, $zahl2);
}
}
$main_win = &new GtkWindow(); //erstellt das Hauptfenster
$main_win->set_title("Rechner"); //Fügt der Titelleiste den Text 'Rechner' hinzu
$main_win->connect('delete-event', 'delete_event'); //wenn der delete-event auftritt, wird funktion delete_event() aufgerufen
$main_win->connect('destroy', 'shutdown'); //wenn das Fenster geschlossen wird, wird die Funktion shutdown() aufgerufen
$auswahl_box = &new GtkVbox(); //erstellt eine vertikale Box
$auswahl_box2 = &new GtkHbox(); //erstellt eine horizontale Box
$auswahl_box3 = &new GtkHbox(); //erstellt eine horizontale Box
$auswahl_box4 = &new GtkHbox(); //erstellt eine horizontale Box
$txt_zahl1 = &new GtkEntry(); //erstellt das erste Textfeld
$txt_zahl2 = &new GtkEntry(); //erstellt das zweite Textfeld
$auswahl_box->pack_start($txt_zahl1); //fügt der vertikalen Box das erste Fenster hinzu
$auswahl_box->pack_start($txt_zahl2); //fügt der vertikalen Box das zweite Fenster hinzu
$plus_btn = &new GtkButton("+ Addition +"); //erstellt eine Schaltfläche mit dem Text '+ Addition +'
$plus_btn->connect_object('clicked', 'get_zahl1', 'plus'); //ruft bei click-event die Funktion get_zahl1("plus") auf
$auswahl_box2->pack_start($plus_btn); //fügt der ersten horizontalen Box die Schaltfläche hinzu
$minus_btn = &new GtkButton("- Subtraktion -"); //erstellt eine Schaltfläche mit dem Text '- Subtraktion -'
$minus_btn->connect_object('clicked', 'get_zahl1', 'minus'); //ruft bei click-event die Funktion get_zahl1("minus") auf
$auswahl_box2->pack_start($minus_btn); //fügt der ersten horizontalen Box die Schaltfläche hinzu
$mal_btn = &new GtkButton("* Multiplikation *"); //erstellt eine Schaltfläche mit dem Text '* Multiplikation *'
$mal_btn->connect_object('clicked', 'get_zahl1', 'mal'); //ruft bei click-event die Funktion get_zahl1("mal") auf
$auswahl_box2->pack_start($mal_btn); //fügt der ersten horizontalen Box die Schaltfläche hinzu
$durch_btn = &new GtkButton("/ Division /"); //erstellt eine Schaltfläche mit dem Text '/ Division /'
$durch_btn->connect_object('clicked', 'get_zahl1', 'durch'); //ruft bei click-event die Funktion get_zahl1("durch") auf
$auswahl_box3->pack_start($durch_btn); //fügt der zweiten horizontalen Box die Schaltfläche hinzu
$mod_btn = &new GtkButton("% Modulo %"); //erstellt eine Schaltfläche mit dem Text '% Modulo %'
$mod_btn->connect_object('clicked', 'get_zahl1', 'modulo'); //ruft bei click-event die Funktion get_zahl1("modulo") auf
$auswahl_box3->pack_start($mod_btn); //fügt der zweiten horizontalen Box die Schaltfläche hinzu
$close_btn = &new GtkButton("Beenden"); //erstellt eine Schaltfläche mit dem Text 'Beenden'
$close_btn->connect_object('clicked', 'shutdown'); //ruft bei click-event die Funktion shutdown auf
$auswahl_box4->pack_start($close_btn); //fügt der dritten horizontalen Box die Schaltfläche hinzu
$auswahl_box->pack_start($auswahl_box2); //fügt der vertikalen Box die erste horizontale Box hinzu
$auswahl_box->pack_start($auswahl_box3); //fügt der vertikalen Box die zweite horizontale Box hinzu
$auswahl_box->pack_start($auswahl_box4); //fügt der vertikalen Box die dritte horizontale Box hinzu
$main_win->add($auswahl_box); //fügt dem Hauptfenster die vertikale Box hinzu
$main_win->show_all(); //Zeigt das Hauptfenster mit allen Komponenten an
gtk::main();
?> Teil 1: Erweiterung Laden PHP-Code:
<?
if(!class_exists('gtk')){
if(strtoupper(substr(PHP_OS, 0,3) == 'WIN'))
dl('php_gtk.dll');
else
dl('php_gtk.so');
}
?>
Hier wird geprüft ob die GTK-Erweiterung bereits geladen wurde, wenn nicht wird sie mit dl(‚php_gtk.dll’) unter Windows und mit dl(‚php_gtk.so’) unter allen anderen Systemen geladen.
Teil 2: Die delete_event() Funktion PHP-Code:
<?
function delete_event(){
return false;
}
?>
Die delete_event() Funktion ist als Handler (siehe unten) für das "delete-event" Signal registriert. Sie gibt false zurück um PHP-GTK zu sagen dass es mit dem Erscheinen des Events weitermachen soll. Wenn die Funktion true zurückgeben würde, würde PHP-GTK mit der Ereignisbehandlung hier aufhören.
Teil 3: Die shutdown() Funktion PHP-Code:
<?
function shutdown(){
print('Wird beendet');
gtk::main_quit();
}
?>
Die shutdown() Funktion ist als Handler für das shutdown Signal registriert. Die Funktion gibt den Text „Wird Beendet“ an der Konsole aus und ruft dann die statische Funktion gtk::main_quit auf.
Bis hierher sehen fast alle Programme gleich aus, jetzt kommen die Funktionen, die sich unterscheiden.
Teil 4: Die fehler() Funktion PHP-Code:
<?
function fehler($message){
$error_win = &new GtkWindow();
$error_win->set_title("Fehler!");
$error_label = &new GtkLabel($message);
$error_win->add($error_label);
$error_win->show_all();
}
?>
Die Funktion fehler() ist dazu da, um Fehlermeldungen auszugeben. Dies geschieht indem ein neues Fenster erscheint, in dem die Fehlermeldung angezeigt wird. Dieses Fenster muss erst erzeugt werden mit „$error_win = &new GtkWindow()“. Nachdem wir das Fenster erzeugt haben, können wir der Titelleiste einen Text mit der Funktion „set_title()“ hinzufügen. In diesem Falle wäre es der Text „Fehler!“. Wenn kein Titel erzeugt wird dann steht oben in der Titelleiste der Dateiname. Nun erzeugen wir ein Label mit „$error_label = &new GtkLabel(‚$message’)“. Wir haben nun ein Label erstellt, das den String enthält, der im Parameter übergeben wurde. Mit „$error_win->add($error_label)“ fügen wir das Label dem Fenster hinzu und mit „error_win->show_all()“ wird das Fenster und das Label sichtbar.
Teil 5: Die get_ergebnis() Funktion PHP-Code:
<?
function get_ergebnis($zahl1, $zahl2, $aktion, $erg){
$erg_win = &new GtkWindow();
$erg_win->set_title("Ergebnis");
$erg_label = &new GtkLabel($zahl1." ".$aktion." ".$zahl2." = ".$erg);
$erg_win->add($erg_label);
$erg_win->show_all();
}
?>
„get_ergebnis() ist dazu da, um das Ergebnis und die Rechnung in einem neuen Fenster anzeigen zu lassen. mit „erg_win = &new GtkWindow()“ wird wie bei der bereits beschriebenen Funktion „fehler()“ ein neues Fenster erzeugt und mit „set_title()“ der Titel in der Titelleiste erzeugt. Es wird wieder ein Label erzeugt und die Rechnung mit Ergebnis wird rein geschrieben.
Teil 6: Die Rechenfunktionen PHP-Code:
<?
function plus($zahl1, $zahl2){
if(is_numeric($zahl1) && is_numeric($zahl2)){
$ergebnis = $zahl1 + $zahl2;
$erg = get_ergebnis($zahl1, $zahl2, '+', $ergebnis);
}else{
fehler("Sie müssen 2 Numerische Werte eingeben");
}
}
function minus($zahl1, $zahl2){
if(is_numeric($zahl1) && is_numeric($zahl2)){
$ergebnis = $zahl1 - $zahl2;
$erg = get_ergebnis($zahl1, $zahl2, '-', $ergebnis);
}else{
fehler("Sie müssen 2 Numerische Werte eingeben");
}
}
function mal($zahl1, $zahl2){
if(is_numeric($zahl1) && is_numeric($zahl2)){
$ergebnis = $zahl1 * $zahl2;
$erg = get_ergebnis($zahl1, $zahl2, '*', $ergebnis);
}else{
fehler("Sie müssen 2 Numerische Werte eingeben");
}
}
function durch($zahl1, $zahl2){
if(is_numeric($zahl1) && is_numeric($zahl2)){
$ergebnis = $zahl1 / $zahl2;
$erg = get_ergebnis($zahl1, $zahl2, '/', $ergebnis);
}else{
fehler("Sie müssen 2 Numerische Werte eingeben");
}
}
function modulo($zahl1, $zahl2){
if(is_numeric($zahl1) && is_numeric($zahl2)){
$ergebnis = $zahl1 % $zahl2;
$erg = get_ergebnis($zahl1, $zahl2, '%', $ergebnis);
}else{
fehler("Sie müssen 2 Numerische Werte eingeben");
}
}
?>
Bei diesen Funktionen handelt es sich lediglich um die Rechenfunktionen, rein PHP, ich denke es ist nicht erforderlich da näher darauf einzugehen.
Teil 7: Die „get_zahl1()“ Funktion PHP-Code:
<?
function get_zahl1($aktion){
global $txt_zahl1;
$zahl1 = $txt_zahl1->get_text();
get_zahl2($zahl1, $aktion);
}
?>
Zunächst wird das erste Textfeld globalisiert, damit man darauf zugreifen kann. Danach holen wir den Wert dieses Textfeldes mit „get_text()“ und speichern diesen Wert in die Variable „$zahl1“. Darauf folgt der Aufruf der Funktion „get_zahl2()“ und übergeben $zahl1 und $aktion als Parameter.
Teil 8: Die „get_zahl2()“ Funktion PHP-Code:
<?
function get_zahl2($zahl1, $aktion){
global $txt_zahl2;
$zahl2 = $txt_zahl2->get_text();
if($aktion == 'plus'){
$akt = plus($zahl1, $zahl2);
}elseif($aktion == 'minus'){
$akt = minus($zahl1, $zahl2);
}elseif($aktion == 'mal'){
$akt = mal($zahl1, $zahl2);
}elseif($aktion == 'durch'){
$akt = durch($zahl1, $zahl2);
}elseif($aktion == 'modulo'){
$akt = modulo($zahl1, $zahl2);
}
}
?>
Wie in „get_zahl1()“ wird auch hier das Textfeld globalisiert, damit man darauf zugreifen kann um danach mit „get_text()“ den darin stehenden Wert zu holen. Nun kommt eine if- elseif- Anweisung, hier wäre auch eine switch- case- Anweisung auch möglich gewesen. Es wird geprüft, welche Aktion gewählt wurde, und die entsprechende Funktion aufgerufen. Zum Beispiel bei der Addition, wird die Funktion „plus()“ mit beiden Zahlen im Parameter aufgerufen.
Teil 9: Erstellen des Hauptfensters PHP-Code:
<?
$main_win = &new GtkWindow();
$main_win->set_title("Rechner");
$main_win->connect('delete-event', 'delete_event');
$main_win->connect('destroy', 'shutdown');
?>
„$main_win->connect(‚destroy’, ‚shutdown’)“ wird aufgerufen, wenn das Fenster „zerstört“ wird, also wenn es geschlossen wird, wird die Funktion „shutdown()“ aufgerufen.
Teil 10: Die Container PHP-Code:
<?
$auswahl_box = &new GtkVbox();
$auswahl_box2 = &new GtkHbox();
$auswahl_box3 = &new GtkHbox();
$auswahl_box4 = &new GtkHbox();
?>
„&new GtkVbox()“ erstellt eine vertikale Box, das bedeutet, dass die darin enthaltenen Objekte vertikal ausgerichtet werden. Mit „&new GtkHbox()“ wird eine horizontale Box erstellt. Diese Boxen sind nötig, da man mit „add()“ dem Fenster nur ein Objekt hinzufügen kann, während man in diese Boxen mit „pack_start()“ beliebig viele Objekte hinzufügen kann.
Teil 11: Die Textfelder PHP-Code:
<?
$txt_zahl1 = &new GtkEntry();
$txt_zahl2 = &new GtkEntry();
?>
Hier werden 2 Textfelder erstellt, in denen die zu berechnenden Zahlen eingegeben werden.
Teil 12: Einfügen der Textfelder PHP-Code:
<?
$auswahl_box->pack_start($txt_zahl1);
$auswahl_box->pack_start($txt_zahl2);
?>
Hier sehen wir das bereits erwähnte „pack_start()“, mit dem die Objekte an den Anfang der Box gesetzt werden.
Teil 13: Erstellen der Schaltflächen und Hinzufügen zu den Boxen PHP-Code:
<?
$plus_btn = &new GtkButton("+ Addition +");
$plus_btn->connect_object('clicked', 'get_zahl1', 'plus');
$auswahl_box2->pack_start($plus_btn);
$minus_btn = &new GtkButton("- Subtraktion -");
$minus_btn->connect_object('clicked', 'get_zahl1', 'minus');
$auswahl_box2->pack_start($minus_btn);
$mal_btn = &new GtkButton("* Multiplikation *");
$mal_btn->connect_object('clicked', 'get_zahl1', 'mal');
$auswahl_box2->pack_start($mal_btn);
$durch_btn = &new GtkButton("/ Division /");
$durch_btn->connect_object('clicked', 'get_zahl1', 'durch');
$auswahl_box3->pack_start($durch_btn);
$mod_btn = &new GtkButton("% Modulo %");
$mod_btn->connect_object('clicked', 'get_zahl1', 'modulo');
$auswahl_box3->pack_start($mod_btn);
$close_btn = &new GtkButton("Beenden");
$close_btn->connect_object('clicked', 'shutdown');
$auswahl_box4->pack_start($close_btn);
?>
Ich denke dass es nicht nötig ist auf alle Schaltflächen näher einzugehen, da sie sich nur durch ihren Text und einem Parameter unterscheiden. Wir befassen uns als Beispiel lediglich mit dem Additions- Button. Zunächst mit „&new GtkButton()“ eine Schaltfläche erstellen. Der in den Klammern stehende Text gibt den Schaltflächentext an. Danach wird der Schaltfläche mit „connect_object()“ eine Aktion zugewiesen, die beim Senden eines bestimmten Signals aufgerufen wird. Der erste Parameter gibt an, dass beim Signal „Click“ die Funktion aufgerufen wird, die im zweiten Parameter steht, in diesem Falle „get_zahl1()“. Der dritte optionale Parameter übergibt der aufgerufenen Funktion den Parameter, in diesem Fall die Aktion „plus“.
Nun wird die Schaltfläche der ersten Box hinzugefügt.
Teil 14: Verschachteln der Boxen PHP-Code:
<?
$auswahl_box->pack_start($auswahl_box2);
$auswahl_box->pack_start($auswahl_box3);
$auswahl_box->pack_start($auswahl_box4);
?>
Hier werden die drei horizontalen Boxen der vertikalen Box hinzugefügt. Genau wie das Hinzufügen von Schaltflächen, oder sonstigen Objekten, geschieht dies mit „pack_start()“.
Teil 15: Box dem Hauptfenster hinzufügen und Start des Programms PHP-Code:
<?
$main_win->add($auswahl_box);
$main_win->show_all();
gtk::main();
?>
Diese drei Zeilen des Skriptes rufen die Funktion gtk::main auf, diese weist PHP-GTK an das Fenster das wir erstellt haben anzuzeigen und auf Benutzereingaben zu warten um Ereignisse zu starten so dass die Callback Funktionen die wir zuvor definiert haben aufgerufen werden und die verschiedenen Aktionen ausgeführt.
By Joey P.