Kurs PHP-GTK cz.1
PHP-GTK to rozszerzenie PHP stworzone przez Andrieja Zmiewskiego pozwalające używać popularnej biblioteki GTK+ służącej do tworzenia graficznych interfejsów użytkownika na podstawie zestawu dostępnych widgetów (kontrolek). Programy korzystające z PHP-GTK wyróżniają się łatwością i szybkością napisania.
via Wikipedia
Już od dawna chciałem chociaż troszkę poznać to rozszerzenie. Trochę to potrwało zanim cokolwiek się dowiedziałem. Aktualnie sam poznaję PHP-GTK, ale mogę już opisać pewne "podstawy podstaw". Ten kurs proszę traktujcie raczej jako wolne tłumaczenie kolejnego z rozdziałów tutoriala znajdującego się na stronie projektu.
Instalacja
Aby zainstalować rozszerzenie PHP-GTK należy skompilować jego źródła. Dobry kurs na zrobienie tego pod Ubuntu (czyli pewnie też i pod Debianem) znajduje się na forum Ubuntu. Ja tylko przypomnę jak należy skompilować tą paczkę.
Źródła można pobrać stąd. Po ściągnięciu i rozpakowaniu wchodzimy do katalogu, a potem w konsoli wpisujemy:
./buildconf ./configure make sudo make install
Później pozostaje nam jedynie edycja pliku /etc/php5/cli/php.ini, a mianowicie dopisanie na końcu czegoś takiego:
extension=php_gtk2.so
Hello World
Zawsze wszystko zaczyna się od tego prostego skryptu/programu. Naszym celem będzie wyświetlenie okienka dialogowego z napisem "Hello World". Podobnie jak innym kursie przedstawię najpierw kod, a potem zajmę się jego tłumaczeniem.
<?php
if (!class_exists('gtk')) {
die("Please load the php-gtk2 module in your php.ini\r\n");
}
$wnd = new GtkWindow();
$wnd->set_title('Hello world');
$wnd->connect_simple('destroy', array('gtk', 'main_quit'));
$lblHello = new GtkLabel("Just wanted to say\r\n'Hello world!'");
$wnd->add($lblHello);
$wnd->show_all();
Gtk::main();
?>
Jeśli pokaże nam się komunikat: Fatal error: Call to undefined function: connect_simple() to oznacza, że prawdopodobnie korzystasz z wersji GTK1. Ten kurs obejmuje jedynie GTK2, także nie masz czego tutaj szukać ;-]
Takiemu plikowi nadajemy dowolną nazwę, ale dla odróżnienia od innych, zwykłych, skryptów PHP nadajmy mu rozszerzenie *.phpw. Ważne jest aby odpalić skrypt spod konsoli poleceniem php {nazwa_pliku}. Otwierając przez przeglądarkie nie zobaczymy żadnych efektów.
Na specjalne życzenie S. wstawiam dodatkowo zrzut efektu działania tego skryptu:

Sprawdzanie czy klasa GTK istnieje
if (!class_exists('gtk')) {
die("Please load the php-gtk2 module in your php.ini\r\n");
}
Te linijki są odpowiedzialne za sprawdzenie, czy rozszerzenie PHP-GTK jest zainstalowane. Jeśli nie jest skrypt się nie wykona, ponieważ nie znajdzie klasy "gtk". Dawniej w takim wypadku stosowało się polecenie dl(), lecz w PHP 5 to polecenie posiada status "deprecated", także nie zaleca się jego stosowania.
Tworzenie głównego okna
$wnd = new GtkWindow();
Tworzenie nowego okna jest proste jak tworzenie nowego obiektu. Zmienna $wnd jest właśnie deklarowana jako obiekt.
$wnd->set_title('Hello world');
Metoda set_title sprawia, że okienko będzie miało jakiś tytuł. Wiadomo, że to akurat jest przydatne ;-)
$wnd->connect_simple('destroy', array('gtk', 'main_quit'));
To jest bardzo ważna linijka. Bez niej po wyłączeniu skryptu główna pętla będzie się cały czas wykonywała. W tym wypadku metoda connect_simple sprawia, że po zamknięciu (a dosłownie mówiąc - po zniszczeniu) okna pętla zostanie przerwana.
Metoda connect_simple służy również do podpinania różnych zdarzeń pod odpowiednie funkcje. Przykłado dla kliknięcia buttona, który jest zdefinowany w osobnej zmiennej, skorzystanie z tej metody wyglądałoby tak:
$button->connect_simple("clicked", array($wnd, "zdarzenie"));
Po kliknięciu na ten guzik zostanie wywołana funkcja "zdarzenie". W następnych częściach postaram się lepiej przedstawić jak z czegoś takiego korzystać.
Tworzenie labela, z napisem "Hello World"
Tworzenie nowego labela (tudzież etykietki) polega na stworzeniu nowego obiektu. W naszym przykładzie jest to po prostu:
$lblHello = new GtkLabel("Just wanted to say\r\n'Hello world!'");
Jak widać nowa etykietka to nowy obiekt, a jej zawartość to paramter, który został podany podczas tworzenia obiektu.
Aby dodać (hmm dokleić) naszą etykietę należy jeszcze dopisać:
$wnd->add($lblHello);
Główne okno sprawia jeden mały problem. Jest nim mianowicie to, że można do niego "wsadzić" tylko jeden widżet. W tej części kursu tylko jeden widżet jest przyczepiany, także nie ma większych problemów, ale w późniejszych częściach widżety trzeba będzie "składować" w jakimś pojemniku. Taki pojemnik dopiero przytwierdzamy do głównego okna. Umożliwi to nam wyświetlenie kilku widżetów w głównym oknie.
Wyświetlenie okna
Póki co naszeg okno nie będzie widoczne. Aby je pokazać, należy skorzystać z metody show_all():
$wnd->show_all();
Ta metoda sprawi, że zostaną pokazane wszystkie widżety. Można również skorzystać z metody show(), ale w tym wypadku należałoby stosować ją dla każdego obiektu, ponieważ inaczej nie zostanie wyświetlony.
Po tych "zabiegach" pozostaje nam odpalenie głównej pętli Gtk::main();. Ta pętla sprawi, że nasze okno będzie się wyświetlało nawet wtedy kiedy skrypt będzie bezczynny. Normalnie (tzn, bez tej pętli) nasz skrypt by się wykonał, a okno prawdopodobnie by tylko mignęło, ponieważ po wykonaniu działania skrypt by się wyłączył, czyli nasze okno by zginęło.
Podsumowanie
W tym (bardzo) krótkim kursie przedstawiłem sposób instalacji rozszerzenia PHP-GTK, oraz bardzo podstawowego sposobu pisania skryptów z wykorzystaniem klasy "gtk". W następnym kursie postaram się coś więcej już przedstawić. Nie wiem kiedy kolejna część wyjdzie, ale powinna się ukazać.
Gdyby ktoś chciał bardziej poznać PHP-GTK to niech zajrzy sobie na anglojęzyczny kurs.
Komentarze (e325680)
S
Jak mozna zrobic tutorial o robieniu okienek bez wklejenia zadnego screena?
radmen
Wklej sobie i zobacz kod… W tym wypadku to w ogóle nie jest potrzebne
flegmatyk
Hmm a mnie ciekawi do czego może służyć ta klasa… Chyba nie wyświetla okienek u klienta, w przeglądarce, tylko na serwerze, czy jak?
radmen
W tym wypadku tylko na serwerze, albo dokładniej mówiąc na lokalnym hoście.
Gdybyś się pytał jaki tego cel, to wiedz, że w KateOS napisano masę aplikacji wykorzystujących właśnie PHP-GTK ;-]
flegmatyk
Hmm, sprawa ciekawa, a o tym z KatoOS to nie wiedziałem ;)
sf
Cały warunek z tym if class_exists(‘gtk’) jest zbędne. To tak jakby sprawdzać np. czy jest np klasa PDO. Całkowicie niepotrzebna rzecz.
radmen
SF: o dziwo moje PHP5 nie ma PDO, a powinno mieć standardowo wbudowane. Poza tym nie każdy ma to rozszerzenie, a ten warunek sprawdzi i wywali odpowiedni komunikat zamiast ogromu błędów
sf
Jakiego ogromu? :) Przy pierwszej brakującej klasie napisze, że nie istnieje i tyle. Wole standardowe błędy php niż pisanie swoich ;) Jak tak bardzo chce się sprawdzać zainstalowane moduły to proponuje phpinfo() :P
radmen
SF: oki trochę się zagalopowałem. Ale IMHO to jest wygodniejsze dla szaraczka, który nie zna PHP a chce skorzystać z takiej aplikacji
sf
Z takim podejściem mogę się zgodzić, ale osobiście dałbym komentarz, aby to potem wywalić ;)
radmen
Hehe no już dałeś, także ktokolwiek będzie czytał komentarze to przeczyta i Twojego komenta ;]
pitu
Kursik fajnie się zapowiada. Społeczność czeka na kolejne odsłowny ;)
radmen
Cholera niedługo będę musioał faktycznie coś naskrobać :)
_kUtek_
czekamy, czekamy. ;-)
blog radmena
Kurs PHP-GTK cz. 2
Już minęło sporo czasu od pojawienia się pierwszej części kursu PHP-GTK. Chciałem mocno przeprosić za to, że musieliście czekać, niestety w sporej mierze to wina mojego lenistwa...
Dzisiaj zajmiemy się czymś bardziej skomplikowanym. Stw[...]