Knihovna PHP-GTK

Skriptovací jazyk PHP se používá na serveru ke generování dynamických HTML stránek. Podobné tvrzení si můžete přečíst téměř v každé knize nebo článku, který se PHP zabývá. Málokdo však ví, že ho lze s pomocí knihovny PHP-GTK použít i k programování klasických grafických aplikací ve Windows i v Unixu.

Binární verze 0.52 pro Windows

Zdrojové kódy verze 0.52

Oficiální referenční příručka

http://gtk.php.net

typ softwaru  demoverze  |   operační systém  Win.9x/Me, Win.2k,.Win.XP  |   objem dat  9,2.MB  |   jazyk  anglicky  |   cena  2000 Kč

Knihovna GTK+ původně vznikla pro grafický editor Gimp. Její obliba rychle rostla a později se stala základem GNU desktopového prostředí Gnome. Pojem GTK není tedy ve světě Linuxu neznámý, ale existuje také verze knihovny pro Windows. PHP-GTK potom rozšiřuje jazyk PHP o možnost vytváření grafických GTK aplikací, které nijak nevyužívají webový server a jsou relativně dobře přenositelné mezi různými operačními systémy. Výsledný program běží na vašem počítači podobně jako Word nebo Mozilla, (spustí se např. příkazem php skritp.php.

Vzhled okna ve Windows
Screenshot - Windows

Vzhled okna v Linuxu
Screenshot - Linux

Instalace

Před instalací v Linuxu se ujistěte, že máte nainstalovanou CGI verzi PHP (alespoň ve 4. verzi) a knihovnu GTK (verzi 1.26).

Trochu zklamaně musíme říci, že na rozdíl od Linuxu jste ve Windows ušetřeni mnoha problémů. Na domovské stránce nebo na CD najdete předkompilovanou aktuální verzi (momentálně 0.5.2), která obsahuje vše potřebné, včetně několika ukázkových skriptů, kterými můžete otestovat, jestli všechno funguje tak, jak má.

V některých distribucích Linuxu můžete zkusit nainstalovat existující RPM balíky, ale připravte se na hotové orgie závislostí a kolizí (testováno na RedHat 7.3 a Mandrake 8.1). My jsme to po 20 minutách vzdal, protože se instalace začala podezřele podobat tvorbě nové distribuce, a vyzkoušeli zdrojové kódy. Situace však nebyla o moc lepší, ale všechny chyby si už ani nepamatujeme (z mailing listu jseme zjistili, že nejsme sami, kdo má s kompilací problémy). Nakonec jsme bez problémů nainstalovali starší verzi 0.5 klasickým způsobem:

  ./configure
  make
  make install

Čeština

Drobný zádrhel představuje naše mateřština, tedy její diakritická část. PHP-GTK vnitřně používá pro kódování řetězců Unicode, což na většině systémů způsobí problémy se zobrazováním některých znaků.

S tím se můžete vypořádat některým z následujících způsobů:

Ukázková aplikace

Základní principy tvorby programu s PHP-GTK jsme se rozhodli ukázat na jednoduchém programu, jehož jedinou funkcí je vytvoření zástupce internetové adresy URL na pracovní ploše Windows. Jde v podstatě o obyčejný textový soubor s příponou .url. Soubor může vypadat třeba takto:

  [DEFAULT]
  BASEURL=http://www.google.com/
  [InternetShortcut]
  URL=http://www.google.com/
  Modified=E086A4673499C20101

Poslední řádek není nutný. Program si od uživatele vyžádá cílový adresář, jméno souboru a URL adresu. Výsledný program tedy nebude přenositelný, respektive fungovat bude všude, ale výsledek vám bude jinde než ve Windows naprosto k ničemu. Úprava pro Linux však není složitá – jde jen o to, rozeznat operační systém a podle něj zapsat data v požadovaném formátu do souboru. Musíte ale pamatovat na to, že ne každý desktop pracuje se stejným formátem souboru, navíc např. KDE má tuto funkci integrovanou. Hotový skript je zde.

<?php
  if (!class_exists('gtk')) {
    if (strtoupper(substr(PHP_OS, 0,3) == 'WIN'))
      dl('php_gtk.dll');
    else
      dl('php_gtk.so');
}

Takto by měl začínat každý skript, který si chce dělat jakékoliv ambice na přenositelnost. První podmínka zkouší, jestli už je knihovna PHP-GTK zavedena v paměti a pokud ne, druhá podmínka zavede podle operačního systému správnou verzi knihovny. Následují definice funkcí.

  function delete_event()
  {
    return false;
  }

Funkce delete_event se zaregistruje jako obslužná rutina (handler) pro signál delete-event, která je vyvolána v okamžiku, kdy systém nebo window manažer pošle požadavek k odstranění některého widgetu. Signál zavolá metodu destroy(), která zruší objekt a uvolní paměť. Typicky se s ní můžete setkat v okamžiku, kdy kliknete na ikonu pro uzavření okna v titulkovém pruhu. Pokud změníte návratovou hodnotu funkce na true, nepůjde okno standardním způsobem uzavřít. Toho můžete využít pro vyvolání potvrzovacího dialogu, ve kterém se ptáte, zda chce uživatel opravdu skončit.

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

Zde, uvnitř funkce destroy(), voláme statickou funkci pro ukončení programu. Pokud ji nepoužijete a ukončíte program, okno sice zmizí z obrazovky, ale v paměti zůstane.

  function create_shortcut()
  {
    global $dir_entry, $name_entry, $adr_entry;

    $filename = $dir_entry->get_text().$name_entry->get_text();
    $file = fopen($filename, "w") or die("\nSoubor nelze vytvorit!\n");

    fputs($file, "[DEFAULT]\nBASEURL=".$adr_entry->get_text()."\n");
    fputs($file, "[InternetShortcut]\nURL=".$adr_entry->get_text()."\n");

    fclose($file) or die("Soubor nelze uzavrit!");

    $name_entry->set_text(".url");
    $name_entry->set_position(0);
    $adr_entry->set_text("http://");
  }

Toto je funkce, která vytvoří zmíněného zástupce. Mimo standardní funkce PHP pro práci se soubory obsahuje volání tří různých metod objektu GtkEntry:

A nyní už můžeme vytvářet samotné grafické rozhraní programu. Začneme hlavním oknem.

  $window = &new GtkWindow();
  $window->connect("destroy","destroy");
  $window->connect("delete_event","delete_event");
  $window->set_usize(350, 150);
  $window->set_title("Novy zastupce URL");
  $window->set_border_width(4);
  $window->set_position(GTK_WIN_POS_CENTER);

  $table = &new GtkTable(4, 2);
  $window->add($table);

Jak vidíte není to nic složitého. Na prvním řádku voláme konstruktor třídy GtkWindow, čímž vytvoříme novou instanci objektu. Následuje dvojí volání metody connect(), která k signálům připojuje výše definované obslužné rutiny: delete_event zavře okno a destroy definitivně ukončí program. Zbylé čtyři metody objektu $window nastavují jeho vlastnosti: rozměry, titulek, šířku okraje a počáteční umístění na obrazovce pomocí výčtové konstanty. Tyto konstanty má k dispozici mnoho widgetů a jejich pomocí lze snadno změnit řadu vlastností. Nejlepší bude, když se podíváte do manuálu.

Předposlední řádek úryvku vytváří objekt GtkTable. GtkTable slouží k rozmístění dalších prvků v rodičovském okně a jeho parametry vyjadřují počet řádků a sloupců tabulky. Do jednotlivých buněk se potom umísťují dceřiné prvky. Pokud vytváříte jenom jednoduchý program, můžete zvážit, jestli si nevystačíte s prvky GtkVBox a GtkHBox, jejichž použití je jednodušší, ale výsledný efekt nemusí být většinou tak pěkný.

A na posledním řádku přidáme objekt $table do hlavního okna. Tím jsme připravili kostru programu a teď je nutno přidat popisky, textová pole apod.

  $dir_label = &new GtkLabel("Adresar");
  //a připojíme popisek do levého horního rohu (0 zleva, 1 z prava, 0 se shora, 1 ze zdola)
  $table->attach($dir_label, 0, 1, 0, 1);
  $name_label = &new GtkLabel("Jmeno");
  $table->attach($name_label, 0, 1, 1, 2);
  $adr_label = &new GtkLabel("URL adresa");
  $table->attach($adr_label, 0, 1, 2, 3);

Běžné textové popisky se vytváří pomocí třídy GtkLabel. Parametr, který přijímá konstruktor, je textový řetězec, který se má zobrazit. Ihned po vytvoření přidáme popisek do tabulky $table. K tomu použijeme metodu attach(), kde první parametr je jméno přidávaného prvku a následující čtyři čísla udávají pozici prvku v tabulce (číslováno od nuly).

  $dir_entry = &new GtkEntry();
  $dir_entry->set_text("C:\\Documents and Settings\\petr\\Plocha\\");
  $table->attach($dir_entry, 1, 2, 0, 1);
  $name_entry = &new GtkEntry();
  $name_entry->set_text(".url");
  $name_entry->set_position(0);
  $table->attach($name_entry, 1, 2, 1, 2);
  $adr_entry = &new GtkEntry();
  $adr_entry->set_text("http://");
  $table->attach($adr_entry, 1, 2, 2, 3);

Stejným způsobem vytvoříme textová pole, jen místo třídy GtkLabel použijeme třídu GtkEntry. Navíc však použijeme výše zmíněné metody pro nastavení implicitního textu a umístění kurzoru.

  $button = &new GtkButton("Vytvorit!");
  $button->connect("clicked", "create_shortcut");
  $table->attach($button, 0, 2, 3, 4);

Tlačítka se tvoří pomocí třídy GtkButton. Vytvoří se a do okna umístí stejně jako předchozí prvky. Od tlačítka však očekáváme nějakou činnost, proto k němu musíme ještě připojit signál, na který bude reagovat, a handler, který signál zpracuje. V našem případě to bude právě signál clicked, který zavolá funkci create_shortcut.

  $tip = &new GtkTooltips();
  $tip->set_delay(200);
  $tip->set_tip($button, "Vytvori zastupce URL");

Drobnou, ale příjemnou užitečností je nápověda v podobě plovoucích tipů. Po vytvoření instance třídy GtkTooltips nastavíme dobu v milisekundách, po které se má nápověda zobrazit, když ponecháme kurzor myší nad widgetem s nápovědou. Potom dáme na vědomí, že se nápověda vztahuje ke tlačítku $button.

  $window->set_focus($name_entry);
  $window->show_all();

Pomalu jsme se přiblížili ke konci programu. Metodou set_focus() určíme, že aktivním prvkem bude implicitně textové pole $name_entry – uživatel tak může rovnou zadat jméno souboru.

Vše, co jsme zatím udělali, však existuje jenom někde v paměti, ale na obrazovce by se po spuštění nic nezobrazilo. Proto zavoláním

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

zobrazíme okno a všechny připojené prvky a úplně nakonec spustíme hlavní smyčku programu.

Ukázky hotových programů

Všechny uvedené programy a mnoho dalších je volně ke stažení na domovské stránce knihovny PHP-GTK.

IP Look-up
Jednoduchý program pro zjištění IP adresy zadané domény.
Stáhnout zde

Number Converter
Program pro převod základních číselných soustav.
Stáhnout zde

PHP Header Grabber
Zobrazí HTTP hlavičky, které se odesílají při navazování spojení, a umožní jejich uložení do souboru.
Stáhnout zde

Porg
Utilitka pro hromadné přejmenování souborů.
Stáhnout zde


Teak

Teak je příkladem většího programu v PHP-GTK. Jde o poštovního klient s podporou protokolu IMAP a vlastním adresářem.
Stáhnout zde

Závěr

Pokud jste dočetli až jsme a vyzkoušeli si vlastnoručně a úspěšně napsat nějaký program, pak vám gratulujeme. Asi jste pochopili, že s knihovnou PHP-GTK nemá smysl pouštět se do nějakých velkých programů, ale při psaní drobných utilit může být její použití jednodušší, než psát kód třeba v C++. Na domovské stránce i zde na CD naleznete několik příkladů různé složitosti, kterými se můžete inspirovat.

Petr Kinšt