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:

PHP-GTK Hello World Script

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.

15 Responses to “Kurs PHP-GTK cz.1”

  1. S June 4, 2007 at 1:02 pm #

    Jak mozna zrobic tutorial o robieniu okienek bez wklejenia zadnego screena?

  2. radmen June 4, 2007 at 1:02 pm #

    Wklej sobie i zobacz kod… W tym wypadku to w ogóle nie jest potrzebne

  3. flegmatyk June 4, 2007 at 1:02 pm #

    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?

  4. radmen June 4, 2007 at 1:02 pm #

    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 ;-]

  5. flegmatyk June 4, 2007 at 1:02 pm #

    Hmm, sprawa ciekawa, a o tym z KatoOS to nie wiedziałem ;)

  6. sf June 4, 2007 at 1:02 pm #

    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.

  7. radmen June 4, 2007 at 1:02 pm #

    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

  8. sf June 4, 2007 at 1:02 pm #

    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

  9. radmen June 4, 2007 at 1:02 pm #

    SF: oki trochę się zagalopowałem. Ale IMHO to jest wygodniejsze dla szaraczka, który nie zna PHP a chce skorzystać z takiej aplikacji

  10. sf June 4, 2007 at 1:02 pm #

    Z takim podejściem mogę się zgodzić, ale osobiście dałbym komentarz, aby to potem wywalić ;)

  11. radmen June 4, 2007 at 1:02 pm #

    Hehe no już dałeś, także ktokolwiek będzie czytał komentarze to przeczyta i Twojego komenta ;]

  12. pitu June 4, 2007 at 1:02 pm #

    Kursik fajnie się zapowiada. Społeczność czeka na kolejne odsłowny ;)

  13. radmen June 4, 2007 at 1:02 pm #

    Cholera niedługo będę musioał faktycznie coś naskrobać :)

  14. _kUtek_ June 4, 2007 at 1:02 pm #

    czekamy, czekamy. ;-)

  15. blog radmena June 4, 2007 at 1:02 pm #

    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[...]