PHP-GTK

Tutorial (první díl)

Před tím, než se pustíme do prvních pokusů s okny, musíme mít na paměti, že každý PHP-GTK program vyžaduje spuštění tzv. hlavní smyčky. Ta se spouští zápisem:

Gtk::main();

Vytvoření okna

K tomu abychom vytvořili okno používáme třídu GtkWindow. Prvním krokem je následující zápis:

$okno = new GtkWindow;

Objekt okno jsme tímto uložili do proměnné s názvem okno. Nyní můžeme aplikovat na okno všechny jeho dostupné vlastnosti a metody. Asi tou nejdůležitější metodou je show_all(). Její zavolání je podmínkou k tomu, aby se okno vůbec zobrazilo:

$okno->show_all();

Vše co jsme si nyní popsali již stačí k tomu, abychom mohli provést první demonstraci možností PHP-GTK. Program, jenž nám zobrazí jednoduché okno bude mít jen pět řádků:

   <?php
    $okno = new GtkWindow();
    $okno->show_all();
    Gtk::main();
   ?>
   

A takto bude výsledek vypadat vizuálně:

PHP-GTK screenshot

Jakmile okno zavřeme, brzy budeme mít problémy s příkazovým řádkem, který nebude přijímat naše příkazy. Je to tím, že jsme správně neošetřili ukončení programu. Jakmile příkazový řádek nereaguje, vše napravíme stiskem kombinace kláves Ctrl+C. Aby se to příště neopakovalo, musíme program doplnit dalším kódem, který zaručí že dojde k jeho korektnímu ukončení.

Aplikace se ukončí voláním metody Gtk::main_quit(). Musíme ji vložit do těla funkce, aby se nám nespustila ihned, ale až v okamžiku zavírání okna. Funkci pak zavoláme pomocí metody connect_simple(), připojené k objektu okna. Dva její parametry jsou povinné:

  1. událost (signál)
  2. název funkce

Událostí může být v tomto případě jedině "destroy" tedy uzavření okna, název funkce bude shodný s tím, který jsme si určili např. ZavreniProgramu.

Náš upravený program tedy bude vypadat takto:

<?php
  function UkonciProgram()
   {
   Gtk::main_quit();
   }

  $okno = new GtkWindow();
  $okno->connect_simple("destroy","UkonciProgram");
  $okno->show_all();

  Gtk::main();
?>
   

Jakmile aplikaci spustíme, vizuálně bude výsledek stejný, jen již nebudeme mít problémy s příkazovým řádkem. Po ošetření tohoto problému můžeme dále přikročit k práci s okny.

V prvé řadě budeme chtít oknu stanovit rozměry. To provedeme metodou set_size_request(). Očekávají se dva parametry. Nejdříve šířka okna a poté výška okna v pixelech:

$okno->set_size_request(300,200);

Dále asi budeme chtít určit titulek, zobrazovaný v záhlaví okna. K tomu účelu je k dispozici metoda set_title().

$okno->set_title("moje aplikace");

Rozbal další možnosti práce s okny »

Popisek

I po předchozím nastavení výše zmiňovaných vlastností vypadá naše okno poněkud bídně. Nic v něm totiž není. Tak se to teď pokusíme napravit a do plochy okna něco vložíme. Jako první k vyzkoušení se nabízí popisek. Ten je v PHP-GTK reprezentován třídou GtkLabel. Vytvořme tedy nový popisek a uložme jej do proměnné popisek. Už při konstrukci objektu můžeme zadat řetězec, který se jakožto popisek zobrazí. Jakmile je popisek vytvořen, musíme použít na objektu okno metodu add(), která popisek do okna vloží. Celý kód tedy bude nyní vypadat takto:

<?php
function UkonciProgram()
 {
 Gtk::main_quit();
 }

$okno = new GtkWindow();
$okno->set_title("moje aplikace");
$okno->set_size_request(300,200);
$okno->connect_simple("destroy","UkonciProgram");

$popisek = new GtkLabel("obsah popisku");
$okno->add($popisek);

$okno->show_all();

Gtk::main();
?>

A takto bude okno vypadat, jakmile skript spustíme:

PHP-GTK screenshot

Rozbal další možnosti práce s popiskem »

Tlačítko

Nyní vyměníme popisek za tlačítko. Zdůrazňuji vyměníme, tedy smažeme řádky, kterými jsme vytvořili a přidali do okna popisek. Později bude vysvětleno proč. Tlačítko je zastoupeno třídou GtkButton. Podobně jako u popisku už při konstrukci objektu může být zadán text, jenž bude na tlačítku zobrazen. Tlačítko pak opět musíme připojit metodou add() do okna. Namísto řádků souvisejících s popiskem, nyní vložíme kód který zajistí zobrazení tlačítka:

$tlacitko = new GtkButton("ahoj");
$okno->add($tlacitko);

Vizuálně bude výsledek vypadat takto:

PHP-GTK screenshot

Výsledek se nám asi nebude líbit jelikož tlačítko zabírá celou plochu okna. Můžeme to vylepšit použijeme-li metodu set_border_width(), díky níž můžeme zadat šířku okraje tlačítka v pixelech.

$tlacitko->set_border_width(20);

Je třeba ale říci, že standardního vzhled tlačítek je dosahováno až při kompletaci boxu, ke kterému se dostanu později.

Někdo hodně aktivní z vás možná předběhl obsah tohoto článku a zkoušel přidat do okna další tlačítko nebo se pokusil do okna vložit popisek i tlačítko. Vždy ale došlo k tomu, že se zobrazil jen jeden z objektů, na příkazovém řádku se navíc objevilo varování tohoto obsahu:

Gtk-WARNING **: Attempting to add a widget with type GtkLabel to a GtkWindow,
but as a GtkBin subclass a GtkWindow can only contain one widget at a time;
it already contains a widget of type GtkButton
   

Nezdar tkví v tomto případě v tom, že na nejvyšší úrovni okna smí být pouze jeden objekt, a tedy že metodu add() můžete použít na objektu okno jen jednou. Jak ale přidat do okna více tlačítek, popisků nebo dalších objektů? Tento problém řeší tzv.Boxy.

Přejít na další díl