Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Vlastnosti a výhody toolkitu PyGTK

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

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

Ú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:

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

Školení: Linux – Firewall, Samba, VPN

Na třídenním školení se naučíte nainstalovat a spravovat Firewall a Router, SAMBA Doménový a Souborový server. Dále si zprovozníte vlastní, zabezpečený VPN server.

Podrobnější informace a přihláška

Ohodnoťte jako ve škole:
Průměrná známka 3,09

Přehled názorů

Qt
Lojza 28. 7. 2008 00:57
Nový
├ 
Re: Qt
luky 28. 7. 2008 01:05
Nový
└ 
Re: Qt
anonymní uživatel 28. 7. 2008 01:09
Nový
 
├ 
Re: Qt
anonymní uživatel 28. 7. 2008 03:47
Nový
 
└ 
Re: Qt
JS 28. 7. 2008 06:17
Nový
 
 
└ 
Re: Qt
Pepca 28. 7. 2008 08:33
Nový
 
 
 
├ 
Re: Qt
anonymní uživatel 28. 7. 2008 09:24
Nový
 
 
 
└ 
Re: Qt
JS 28. 7. 2008 09:53
Nový
 
 
 
 
└ 
Re: Qt
asdasdasd 28. 7. 2008 10:02
Nový
 
 
 
 
 
├ 
Gnome a Firefox na Qt
anonymní uživatel 28. 7. 2008 16:44
Nový
 
 
 
 
 
│
└ 
Re: Gnome a Firefox na Qt
Michal Smrž 28. 7. 2008 18:01
Nový
 
 
 
 
 
│
 
└ 
Re: Gnome a Firefox na Qt
alblaho 28. 7. 2008 18:12
Nový
 
 
 
 
 
│
 
 
└ 
Re: Gnome a Firefox na Qt
Michal Smrž 28. 7. 2008 18:53
Nový
 
 
 
 
 
│
 
 
 
└ 
Re: Gnome a Firefox na Qt
Rejpal 28. 7. 2008 19:01
Nový
 
 
 
 
 
└ 
Re: Qt
JS 28. 7. 2008 19:41
Nový
supr clanek
luky 28. 7. 2008 00:59
Nový
Chybka v kodu, anglicke promenne
Robert Smol 28. 7. 2008 09:13
Nový
├ 
Re: Chybka v kodu, anglicke promenne
Michal Smrž 28. 7. 2008 09:24
Nový
└ 
Re: Chybka v kodu, anglicke promenne
asdasdasd 28. 7. 2008 10:04
Nový
 
└ 
Re: Chybka v kodu, anglicke promenne
Robert Smol 28. 7. 2008 10:39
Nový
 
 
└ 
Re: Chybka v kodu, anglicke promenne
Roger 28. 7. 2008 11:21
Nový
 
 
 
└ 
Re: Chybka v kodu, anglicke promenne
Inkvizitor 28. 7. 2008 23:34
Nový
 
 
 
 
└ 
Re: Chybka v kodu, anglicke promenne
Michal Smrž 1. 8. 2008 06:45
Nový
paráda
daks 28. 7. 2008 09:19
Nový
PyGTK skvělá volba
paskma 28. 7. 2008 11:06
Nový
├ 
Re: PyGTK skvělá volba
anonymní uživatel 28. 7. 2008 12:08
Nový
│
└ 
Re: PyGTK skvělá volba
paskma 28. 7. 2008 12:18
Nový
│
 
└ 
Re: PyGTK skvělá volba
Tarmaq 28. 7. 2008 12:48
Nový
└ 
Re: PyGTK skvělá volba
Jaroslav Šmíd 28. 7. 2008 12:14
Nový
 
├ 
Re: PyGTK skvělá volba
anonymní uživatel 28. 7. 2008 12:34
Nový
 
│
└ 
Re: PyGTK skvělá volba
Michal Smrž 28. 7. 2008 12:39
Nový
 
│
 
└ 
Re: PyGTK skvělá volba
anonymní uživatel 28. 7. 2008 12:53
Nový
 
│
 
 
├ 
Re: PyGTK skvělá volba
paskma 28. 7. 2008 13:05
Nový
 
│
 
 
└ 
Re: PyGTK skvělá volba
Michal Smrž 28. 7. 2008 13:06
Nový
 
│
 
 
 
└ 
Re: PyGTK skvělá volba
Jaroslav Šmíd 31. 7. 2008 22:19
Nový
 
│
 
 
 
 
└ 
Re: PyGTK skvělá volba
Michal Smrž 1. 8. 2008 06:07
Nový
 
├ 
Re: PyGTK skvělá volba
kozec 28. 7. 2008 13:25
Nový
 
└ 
Re: PyGTK skvělá volba
Rejpal 28. 7. 2008 14:23
Nový
Pygtk vs wxpython
rej 28. 7. 2008 21:52
Nový
├ 
Re: Pygtk vs wxpython
Michal Smrž 28. 7. 2008 22:08
Nový
└ 
Re: Pygtk vs wxpython
rej 28. 7. 2008 22:13
Nový
 
└ 
Re: Pygtk vs wxpython
Rejpal 28. 7. 2008 22:41
Nový
 
 
└ 
Re: Pygtk vs wxpython
rej 29. 7. 2008 09:21
Nový
 
 
 
├ 
Re: Pygtk vs wxpython
Rejpal 29. 7. 2008 09:44
Nový
 
 
 
│
├ 
Re: Pygtk vs wxpython
kyknos 29. 7. 2008 11:03
Nový
 
 
 
│
├ 
Re: Pygtk vs wxpython
Štepán Gabriel 30. 7. 2008 11:36
Nový
 
 
 
│
└ 
Re: Pygtk vs wxpython
rej 1. 8. 2008 11:41
Nový
 
 
 
│
 
└ 
Re: Pygtk vs wxpython
Rejpal 1. 8. 2008 23:43
Nový
 
 
 
└ 
Re: Pygtk vs wxpython
Pavel Tišnovský 29. 7. 2008 10:05
Nový
 
 
 
 
└ 
Re: Pygtk vs wxpython
Rejpal 29. 7. 2008 10:17
Nový
 
 
 
 
 
└ 
Re: Pygtk vs wxpython
Pavel Tišnovský 29. 7. 2008 10:33
Nový
pekny clanok
xxxs 30. 7. 2008 20:13
Nový
└ 
Re: pekny clanok
Michal Smrž 30. 7. 2008 20:42
Nový
 
└ 
Re: pekny clanok
JeCh 2. 8. 2008 15:37
Nový
 
 
└ 
Distribuce
Michal Smrž 2. 8. 2008 17:24
Nový
Problem s pygtk
3draziel 17. 2. 2009 09:15
Nový
└ 
Re: Problem s pygtk
3draziel 17. 2. 2009 21:32
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem