Hlavní navigace

Vlastnosti a výhody toolkitu PyGTK

28. 7. 2008
Doba čtení: 6 minut

Sdílet

Dnešním článkem otevíráme nový seriál o vytváření GUI v Pythonu pomocí svobodného multiplatformního toolkitu GTK+ a jeho bindingu PyGTK. V prvním díle si představíme samotný toolkit a rozebereme jeho výhody. Dále vytvoříme a rozebereme nejmenší možný program s tlačítkem, který má pouhých sedm řádků.

Úvod

Linuxovým uživatelům knihovny GTK+ zřejmě nemusím moc představovat. Jedná se o jeden ze dvou nejpoužívanějších svobodných toolkitů, společně s Qt. Na tomto toolkitu jsou například vystavěna desktopová prostředí Gnome a Xfce a jejich aplikace, které používá mnoho předních linuxových distribucí.

Windows uživatelé zas budou znát multiplatformní programy, jako jsou GIMP, Pidgin, Gajim a jiné, kde mohou vidět GTK+ v akci.

PyGTK je tedy binding, neboli spojovací knihovna, pomocí které můžeme pracovat s GTK+ toolkitem v Pythonu. Pomocí něj tak snadno vytvoříme multiplatformní GUI našim Python skriptům/programům.
Tento toolkit má hned čtyři klady:

  • Funguje na všech třech hlavních platformách: Windows, Linux, Mac.
  • Je LGPL, tudíž je možné jej použít i v uzavřených aplikacích, což je, z ekonomického pohledu, hlavní rozdíl/výhoda oproti Qt, kde toto bez zaplacení možné není (navíc je nutné koupit i binding).
  • Nyní vznikají podpory nejen pro hlavní platformy, ale za zmínku stojí určitě i Nokií tablety (Maemo), OpenMOKO, OLPC a další se snad v budoucnu objeví.
  • Existuje plno tzv. bindingů, které vám jej umožní využívat z jazyků, jaké si oblíbíte. Tyto bindingy, kam moje znalosti sahají, sdílejí licenci GTK+ (LGPL), takže nepředstavují náklady navíc. Jako příklad bych uvedl GTK#, což je binding pro Mono (svobodný .net), a PyGTK, což je binding právě pro Python.

To už je dost výhod, aby se jím člověk začal vážně zabývat. A poslední nepovinná položka. „Píše se to samo“… skoro. Není tam moc věci, co by se daly nepochopit, stačí mít po ruce referenční příručku a vědět, alespoň mlhavě, co v té příručce hledat. A s tím se vám pokusí pomoci tento seriál.
Velice dobrý tutoriál [En] je i přímo na PyGTK stránkách.

Jak to získám

  • Linux – Tady je to již tradičně nejsnadnější. Všechny hlavní distribuce vám jej nabízí v balíčku. OpenSUSE jako python-gtk, Ubuntu jako python-gtk2 apod., stačí jen požádat o instalaci.
  • Windows – Zde je situace tradičně složitější, aneb software si shánějte sám. Tak tedy, seženete jej, samozřejmě, na oficiálních stránkách PyGTK (PyGTK, PyCairo, PyGObject), ale spíše bych vám doporučil All In One Installer zde.
  • Wine [1.1.1] – Instalace stejná jako u Windows. Pouze výsledek není moc použitelný, kvůli fixme:font:ExtTextOutW flags ETO_NUMERICSLOCAL | ETO_NUMERICSLATIN | ETO_PDY unimplemented jsou fonty nesnesitelně veliké (bug je znám, můžete přidat hlas).
  • Mac – Nevím. Musím se přiznat k hrozné věci, Mac jsem v životě v ruce neměl. Jediné, co vím, je, že jsou screenshoty na internetu a že bez nahrání nějakého enginu to na Macu nevypadá vzhledově nejšťastněji.
  • Mobilní zařízení – Zatím nic moc. Podpory se teprve připravují. Hotové je OLPC, OpenMoko a Maemo na Nokiích tabletech. Právě Nokia zřejmě bude tahoun a dá se očekávat podpora i v nových, plně otevřených, Symbianech.

Tak máme nainstalováno, jde se na věc.
Hned z kraje chci říci, že se v tomto seriálu nebudu zabývat Pythonem. Pokud s Pythonem neumíte ani základy a chtěli byste, musím doporučit výbornou příručku Učebnice jazyka Python od Jana Švece, která je zdarma ke stažení z místního archivu knihy.root.cz a kterou si nemohu vynachválit, jelikož jsem sám na ní začínal.

Dost řečí, akce!

Předpokládám, že alespoň základy v Pythonu máme, začneme hned zostra, a to rovnou kódem:

#!/usr/bin/env python

import gtk

okno = gtk.Window()
tlacitko = gtk.Button("Ahoj")

okno.add(tlacitko)
tlacitko.connect("clicked", gtk.main_quit)

okno.show_all()

gtk.main()
Ahoj Linux

Výsledek v Linuxu…

Ahoj Windows

… a ve Windows.

Mimo jiné vidíme, že Windows a Gnome mají rozdílnou představu, jak malé je nejmenší okno, aneb mohu schovat ovládací prvky okna nebo nemohu?

Takže máme okno s tlačítkem, které aplikaci ukončí na 7 řádků. To není špatné, že?
Zkušení uživatelé již nyní řeknou, že to špatné je. Aplikace nejde ukončit křížkem v okně, tlačítko vyplňuje celou plochu okna, apod. Ano, já vím. Toto je jen základní, co nejkratší demonstrace. Popsat vše v jednom díle není účel.

Ti, co umějí počítat do deseti, mě teď zkusí přistihnout, že program má řádků osm. To je pravda, ale první řádek je linuxový a neúčastní se programu (díky # jej Python bere jako komentář).

Rozbor kódu

Co jednotlivé řádky dělají a proč jsou k chodu programu výslovně nutné?

import gtk
Naimportuje GTK a díky tomu pak můžeme používat objekty z této knihovny stylem náš_objekt = gtk.objekt

okno = gtk.Window()
Veškeré prvky jsou instance tříd. Tudíž si takto vytvoříme objekt okno, který je instancí třídy gtk.Window. To bylo odborné vysvětlení. Neodborné je, že máme objekt okno, které je gtk.Window() a má všechny jeho vlastnosti, které můžeme číst a upravovat.

tlacitko = gtk.Button("Ahoj")
To samé jako ve vyšším případě, akorát vytváříme tlačítko a rovnou mu jako parametr předáváme chtěný nápis, jinak bychom museli na dalším řádku mít tlacitko.set_label("Ahoj").

okno.add(tlacitko)
To, že máme tlačítko, neznamená, že víme, kde bude. Teď už ano, bude v: okno.

tlacitko.connect("clicked", gtk.main_quit)
A tedy nám, konečně, začíná přituhovat. Jak GTK, tak Qt pro jednotlivé widgety (objekty oněch toolkitů, okno je widget, tlačítko je widget, posuvník je widget apod.) eviduje signály, které tento widget může vyslat. Tlačítko gtk.Button(), dle referenční příručky, umí vyslat, odborně emitovat, signály activate, clicked, enter, leave, pressed a released. My využíváme „clicked“ (název signálu je řetězec, proto uvozovky) a po vyvolání tohoto signálu vyvoláváme funkci gtk.main_quit, která ukončí naší GTK aplikaci. Závorky nejsou, protože napojit se lze pouze na funkce nebo metody. Pokud chceme oné funkci předat parametry, zapisují se jako další parametry. Např. sčítací funkce – klasicky volaná secti(12,23)  – bude v connectu volána: něco.connect("clicked", secti, 12, 23).

okno.show_all()
To, že prvky vytvoříme, neznamená, že jsou zobrazeny. Nejdříve jim měníme vlastnosti nebo chceme, aby se zobrazily až při nějaké události. To se stane, až když zavoláme jejich metodu show().
Zde používám objekt.show_a­ll(), což zobrazí i přiřazené prvky, tzv. child objekty, tudíž i tlačítko, jinak bych jej musel zobrazit sám pomocí tlacitko.show().

gtk.main()
Začátek „smyčky“. Všechny výše napsané řádky jsou procedurálního (krok za krokem) charakteru. Aneb dojde se k nim, provedou se a tím to hasne.
Schválně si zkuste tento řádek vykomentovat (#). Zjistíte, že Python tento kód bez řečí/chyb provede, jen se nic nestane. On ty prvky vytvoří i je předá k zobrazení, pak ale interpreter skončí a uklidí za sebou → zase je hezky vymaže.
gtk.main() je právě ten řádek, na kterém se interpreter zastaví a předá řízení GTK.
Pokud za gtk.main() vložíte třeba print "Jsem za GTK", zjistíte, že v konzoli se tento nápis neobjeví dříve, než se stiskne tlačítko, které vyvolá gtk.main_quit() – ano, právě tento příkaz ukončí GTK smyčku.
Interpreter se tak konečně dostane k našemu print, do konzole se napíše „Jsem za GTK“ a program skončí.

Blokově lze program rozdělit na:

root_podpora

  • Vytvoříme prvky
  • Upravíme prvkům parametry
  • Vybrané dáme zobrazit
  • Spustíme smyčku

Perlička na závěr:

Mluvím o smyčce, protože původní příkaz byl gtk.mainloop(). Pokud jej vložíte místo gtk.main()… schválně si sami zkuste, co se stane (windowsaři, nezapomeňte, že „servisní výpisy“ se vypisují pouze do příkazové řádky).

Příště

Zlepšení naší první aplikace (odstranění chyb) a více o PyGTK.

Byl pro vás článek přínosný?