Hlavní navigace

Vlastnosti a výhody toolkitu PyGTK

Michal Smrž 28. 7. 2008

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:

  • 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.

Našli jste v článku chybu?

28. 7. 2008 9:13

Jen jsem chtel upozornit, ze ve vypisu kodu chybi carka u funkce connect (ve vysvetleni, uz je to ok). Take bych Vas rad poprosil, mohl byste psat promenne anglicky? Anglictina je v programech standartem, kazdy kdo rika ze ne, by si mel zkusit debugovat program napsany ve francouzstine.

s pozdravem

28. 7. 2008 10:39

Dokumentace, funkce, zdrojovy kod, zdroje na internetu (IRC, howto, tutorialy) jsou prevazne v anglictine (tak to proste je). Nebudu se zde prit, zda-li to je didakticky spravne, na tom mozna neco je, ale cim drive si potencionalni programator osvoji dobre navyky (a tim technicka anglictina rozhodne je), tim lepsi bude. A az napise nejaky program a nekdo z Indie ho bude ladit, tak se nebude muset zamyslet nad tim co znamena Keš, ci le_souventeur (counter).

Lekari se uci latinu, asi to pro vyuku…

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

DigiZone.cz: ČRo rozšiřuje DAB do Berouna

ČRo rozšiřuje DAB do Berouna

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

DigiZone.cz: NG natáčí v Praze seriál o Einsteinovi

NG natáčí v Praze seriál o Einsteinovi

Vitalia.cz: Říká amoleta - a myslí palačinka

Říká amoleta - a myslí palačinka

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

Měšec.cz: Finančním poradcům hrozí vracení provizí

Finančním poradcům hrozí vracení provizí

Podnikatel.cz: 1. den EET? Problémy s pokladnami

1. den EET? Problémy s pokladnami

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

Podnikatel.cz: Prodává přes internet. Kdy platí zdravotko?

Prodává přes internet. Kdy platí zdravotko?

120na80.cz: Rakovina oka. Jak ji poznáte?

Rakovina oka. Jak ji poznáte?

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Vitalia.cz: 9 největších mýtů o mase

9 největších mýtů o mase

Podnikatel.cz: Na poslední chvíli šokuje vyjímkami v EET

Na poslední chvíli šokuje vyjímkami v EET