Portál AbcLinuxu, 7. června 2024 14:04

Stibiho amatérská „příručka“ k PyGTK - díl 1

16.9.2006 13:57 | Přečteno: 1758× | PyGTK | Výběrový blog | poslední úprava: 16.9.2006 17:05

Zdravím, tak jsem ze sebe vypotil první díl povídání o PyGTK, uvidíme co z toho bude, snad to není úplně odpad a do budoucna bude kvalita překladu, příkladů a všeho lepší. Paralelně s jednotlivými díly o samotném PyGTK budu uveřejňovat postupy při psaní samotné aplikace, konkrétně to bude prohlížeč obrázků.



Co se týče dalších dílů o PyGTK, příště bude řeč o upravené a vylepšené AhojSvete a začnu s popisem jednotlivých widgetů...

Stibiho amatérská „příručka“ k PyGTK 2.4


Zdravím všechny u prvního dílu, této snůšky amatérských blábolů na téma Python a GTK. Předem se omlouvám, za všechny chyby, kterých doufám zas tak moc nebude, ale přece jenom, expert nejsem a tohle dělám jenom z radosti. Co se týče mého programování, tak mám nastudované docela dost teorie ale na praktické využití, se dost často nedostalo, buď se mi nechtělo, nebo kdo ví co proč jsem taková lemra :) .

V Pythonu jsem úplný začátečník, umím něco slepit v PHP, trochu jsem blbnul v Javě, pár skopičin v Bashi, nějaké to drobky v PostgreSQL, no, a to bude tak nějak vše, HTML, CSS a podobně to snad ani nemá cenu zmiňovat, to umí kde kdo...

Takže, při psaní využívám PyGTK Reference Manual a Tutorial, GTK+ 2.0 Tutorial, Reference Manual a taky Google.cz.

Když tak kuk sem PyGTK.org a taky tady GTK.org .

Jednotlivé díly budou na pokračování, nevím jak často budu psát, ale snad nějaká pravidelnost bude, nebo aspoň bez větších zpoždění.

Snad někomu pomůžu, něco se naučím i já, a s trochou štěstí nikoho nepřivedu v omyl, to bych nerad, kdyby snad něco takového hrozilo, neváhejte mě rozcupovat v diskuzi :) .

S překladem mám docela problémy, perfektní angličtinář nejsem, ale to hlavní problém není, spíš částo váhám, co přeložit, co ne, vím že někteří lidé mají rádí striktní dodržování anglických názvů, jiní za raději počešťování, nevím no, já jdu střední cestou, to znamená guláš smíchaný z anglických a českých termínů a názvů. To se týká u ukázek kódu. Tam už nevím vůbec, mě jako lamku občas mátly stejné názvy metody/funkce a eventu na které reaguje, takže to se snažím odlišit. Do budoucna se klidně budu řídit vašimi názory, takže doufám že se na téma překladu někdo ozve v diskuzi.


A jdeme na to !


GTK je knihovna určená pro vytváření GUI – tedy grafického uživatelského prostředí. Původně bylo GTK napsáno pro vývoj GIMPu, nyní se používá v mnoha dalších projektech.

Plusy a mínusy GTK oproti třeba Qt hodnotit nemůžu, protože praktickou zkušenost nemám, ale určitě se najde někdo z KDE tábora, kdo se v diskuzi dole ozve a vyzvedne Qt, pokud to bude k věci tak prosím, ale flejmy si nechte na jiné místo ju ?! :)


Mechanismus signálů a zpětných volání


Signály v PyGTK, nejsou to samé jako Unixové signály, i když terminologie je stejná.

Programy napsané v PyGTK fungují právě na systému signálů a patřičné odpovědi na ně, tedy když stiskneme tlačítko myšidla, je widgetem (věcičkou :)) vyslán příslušný signál.

Některé signály dostanou do výbavy (dědí) všechny widgety (např. „destroy“), některé jsou zase specifické pro konkrétní widget (např. stav „toggled“ u toggle buttonu).

Aby se po stisknutí tlačítka, nebo jakékoli události, vykonala příslušná akce, musíme vytvořit něco, co bude čekat na signál např. našeho tlačítka a zavolá příslušnou funkci, to něco se jmenuje handler, nebo taky česky obslužná rutina, budu dále používat handler...


Definice handleru vypadá takto:

nazev_handleru = objekt.connect ( jméno, fce, fce_data)

Kde, „objekt“ je instance GTKwidgetu, která vysílá signál.

Funkce specifikovaná v druhém parametru se nazývá „callback funkce“. Zase si nejsem jistý jak překládat, tak to nechám takhle :)


Definice callback funkce tedy vypadá následovně:

def nazev_callbackFce ( widget, callback_data) :


Pokud je callback funkce metoda objektu, potom ji máme v této podobě :

def nazev_callbackMetoda (self, widget, callback_data) : 

Jen tak na okraj, neměl jsem jasno v tom, jaký je rozdíl, mezi funkcí a metodou objektu. A i když jak jsem zjistil, princip je dost podobný, termíny jsou to dost odlišné a může to zmást... tedy :


FUNKCE –je izolovaný kus kódu, který po zavolání vykoná to co jsme mu předepsali

METODA OBJEKTU – je jak jsem se dočetl zvláštní funkce, která určitým způsobem „patří“ k určitému objektu. Její funkcí je většinou určitým způsobem modifikovat samotný objekt.

Snad jsem to moc nezblbnul a nepíšu kraviny :) Uvedené definice signálů, handleru a callback funkcí je jen základní popis, některé widgety generují specifické signály a jsou volány jiné parametry.


Události ( Events)


Aby váš skript mohl reagovat na to, co s ním uživatel provádí, je systém signálů a callbacků doplněn o systém událostí ( Events). Události odrážejí to, co udělá uživatel, klikne li tedy na button (tlačítko), nastane událost button_press_event. A skript na základě toho rozhodne, co se stane dál.... Tedy koukne co jste mu předepsali k této události a vykoná to ...

Tady můžete kouknout na seznam událostí:

event
button_press_event
button_release_event
scroll_event
motion_notify_event
delete_event
destroy_event
expose_event
key_press_event
key_release_event
enter_notify_event
leave_notify_event
configure_event
focus_in_event
focus_out_event
map_event
unmap_event
property_notify_event
selection_clear_event
selection_request_event
selection_notify_event
proximity_in_event
proximity_out_event
visibility_notify_event
client_event
no_expose_event
window_state_event

Callback funkce (nebo metoda) pro tyto události je maličko jiná.


def nazev_callbackFce ( widget, událost, callback_data) : 

def nazev_callbackMetody ( self, widget, událost, callback_data) :

Pro spojení callback funkce s jednou z těchto událostí, se používá metoda connect() , jméno události se zapisuje do parametru „name“ .

Takže, když chceme určite, co se stane, když se klikne ta tlačítko, použijeme něco takového :


button.connect( "button_press_event", stisk_tlacitka_callback)

Předpokládá se, že tlačítko je GTKbutton widget, když tedy klikneme na tlačítko, zavolá se funkce button_press_callback. A funkce je definována následovně (už to sice víme ale opakování matka moudrosti že …)


def stisk_tlacitka_callback( widget, událost, data ):

Takže asi takhle, připadá mi to docela jednoduché a šikovné... Teď si projdem ukázkové použití GTKbutton widgetu, nastavíme handlery, napíšeme pár metod a hlavně to celé rozebereme, popíšeme, vysvětlíme...

Aplikace tedy bude klasická HelloWorld, po spuštění na nás vykoukne malé okno, s jedním tlačítkem, zatím nic moc, ale základní principy na tom jsou dobře vidět.


Příklad – AhojSvete.py


Kód příkladu AhojSvete


(1)#!/usr/bin/env python
(2)# -*- coding: UTF-8 -*-
(3)
(4)import pygtk
(5)pygtk.require('2.0')
(6)import gtk
(7)
(8)class AhojSvete:
(9)
(10)def ahoj_hlaska(self, widget, data=None):
(11)print "Ahoj světe"
(12)gtk.main_quit()
(13)
(14)def zabij_okno(self, widget, event, data=None):
(15)print "Zavřeli jsme okno"
(16)gtk.main_quit()
(17)
(18)def __init__(self):
(19)self.okno = gtk.Window(gtk.WINDOW_TOPLEVEL)
(20)self.okno.connect("delete_event", self.zabij_okno)
(21)self.okno.set_border_width(10)
(22)self.tlacitko = gtk.Button("Ahoj světe")
(23)self.tlacitko.connect("clicked", self.ahoj_hlaska)
(24)self.okno.add(self.tlacitko)
(25)self.tlacitko.show()
(26)self.okno.show()
(27)
(28)def main(self):
(29)gtk.main()
(30)
(31)if __name__ == "__main__":
(32)ahoj = AhojSvete()
(33)ahoj.main()

Pokud budete kód zkoušet, nezapomeňte na odsazení !


Rozbor příkladu AhojSvete

Teorie bylo až až, koukněte na příklad nahoře, projdem to....

Jinak když skript uložíme např. do souboru AhojSvete.py a spustíme z konzole pomocí python AhojSvete.py tak na nás vyskočí malé okýnko, s jedním buttonem, když kliknem na button, do konzole se vypíše hláška, když okno zavřem, dostanem jinou hlášku ..

Takže …

Co se týče prvních dvou řádků, první umožňuje spuštění skriptu přímo klikem na soubor v Xkách (pokud jste tedy přidělili správná práva) a druhý řádek nastavuje kódování, kdybychom ho nenastavili, tak by se celkem nic nestalo, sice bychom dostali warning, ale skript by se spustil, a české znaky by se zobrazily správně, ale my warningy nechceme, takže jsme kódování nastavili :)

Řádky 8-29 obsahují všechny definice třídy AhojSvete, všechny callback metody (a funkce, ale v tomto konkrétním případě funkci nemáme) a všechny inicializace instancí objektů.

Na řádcích 10-12 máme callback metodu ahoj_hlaska(), která je volána když je stisknut button, když tato událost nastane, je do konzole vypsána hláška „Ahoj světe“ skript se ukončí. V tomto případě vůbec neřešíme jaké instance se metoda týká, neřeší se ani parametry, není třeba. Metoda má za úkol jen vyplivnout na konzoli hlášku a ukončit činnost, tím to pro ni končí. Ale jinak většina callback metod samozřejmě určení instance objektu se kterou se bude něco dít a nastavení parametrů využívá.

Další callback je trochu speciální (řádky 14-16). „zabij_okno“ se spustí, když window manager odešle aplikace zprávu, že tato událost (delete_event) nastala. Tedy, normálně řečeno, když kliknem v okně aplikace na křížek pro zavření, Gnome ihned hlásí aplikaci, že nastala událost delete_event a aplikace už další události ošéfuje tak, jak jsme jí to předepsali, tedy handler reagující na tuto událost spustí naši metodu „zabij_okno“.

Ve skriptu máme tuto metodu, jenom k tomu, abychom při zavírání okna dostali hlášku do konzole, kdyby jste tuto metodu nevytvořili, okno by samozřejmě šlo normálně klasicky zavřít.

Řádky 18-26 popisují inicializační metodu __init__(), která vytváří instance popsaných objektů, právě ona na nás vyplivne okno s tlačítkem a postará se o to, aby si prvky spolu povídali.

Řádek 19 vytváří nové okno, avšak samotné vykreslení okna na obrazovku s provádí příkazem kousek níž, bude o něm řeč. Pro pozdější přístup k instanci okna můžeme použít odkaz „self.window“

Na řádku 20, vidíme ukázku odchycení signálu a zavolání požadované funkce. V tomto případě se čeká na delete_event, tedy zavření okna, tím se zavolá metoda zabij_okno a ta se postará o vypsání hlášky do konzole a zavření okna.

Řádek 21 nastavuje 10px bílého prostoru kolem buttonu, o atributech oken a dalších widgetů bude řeč v dalších dílech.

Řádek 22 vytváří instanci buttonu s popiskem „Ahoj světe“ .

Další řádek nastavuje k události „clicked“ callback metodu „ahoj_hlaska“.

Řádek 24 je „packing“ příkaz, přidává widget do okna a vše o něm bude popsáno v dalších dílech.

Řádky 25,26 mají na starost samotné vykreslení prvků na obrazovku.

Řádky 28,29 definují „main()“ metodu, která volá gtk.main() funkci.

Řádky 31,33 dovolují spuštění celého programu, vytvářejí instanci třídy AhojSvete .


Hotovo :)


První díl ke stažení v PDF.        

Hodnocení: 93 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

16.9.2006 14:36 pepik | skóre: 16 | blog: nevim | Chlumec nad Cidlinou
Rozbalit Rozbalit vše Re: Stibiho amatérská „příručka“ k PyGTK - díl 1
Odpovědět | Sbalit | Link | Blokovat | Admin
Výborně. Tento zápis je opravdu super. S PyGTK bych celkem chtěl umět a jelikož nejsem moc dobrý angličtinář, tak tento blog mi opravdu hodně pomohl se alespoň odrazit. Byl bych rád kdyby autor napsal i nějaké pokračování o propojení s glade souborem, abych nemusel GUI psát ručně. Držím palce!
Martin Stiborský avatar 16.9.2006 16:07 Martin Stiborský | skóre: 26 | blog: Stibiho bláboly | Opava
Rozbalit Rozbalit vše Re: Stibiho amatérská „příručka“ k PyGTK - díl 1
Noo o Glade se psát moc nechystám, zatím mi úplně stačí GVim...
Kvík ..
kozzi avatar 16.9.2006 14:43 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
Rozbalit Rozbalit vše Re: Stibiho amatérská „příručka“ k PyGTK - díl 1
Odpovědět | Sbalit | Link | Blokovat | Admin
Moc pěkný. Musíím tě pochválit. Akorát mám radši když se v kódu používají anglické názvy ale to vadi mozna jen me. Ale o něco víc mi vadí odsazování zdroje. měl by jsi používat tabulátor. Jinak hodnocení davam dobre
Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
18.9.2006 01:33 pm
Rozbalit Rozbalit vše Re: Stibiho amatérská „příručka“ k PyGTK - díl 1
Ne! V Pythonu je definovany standard odsazovat 4 mezerami. Nemusi se ti to libit, ale je to tak a je nutne a spravne se tohoto standardu drzet, aby byly zdrojaky jednotne a ne kazda ves jiny pes.
16.9.2006 14:50 rajcze | skóre: 6 | blog: rajcze | kus od Brna
Rozbalit Rozbalit vše Re: Stibiho amatérská „příručka“ k PyGTK - díl 1
Odpovědět | Sbalit | Link | Blokovat | Admin
zkus se kouknout na tohle:
http://www.py.cz/PythonAGlade
Rules of Optimization: Rule 1: Don't do it. Rule 2 (for experts only): Don't do it yet.
16.9.2006 16:05 Petr Bayer | blog: NIL
Rozbalit Rozbalit vše Re: Stibiho amatérská „příručka“ k PyGTK - díl 1
glade neni vselek
Kill the poor!
16.9.2006 18:22 rajcze | skóre: 6 | blog: rajcze | kus od Brna
Rozbalit Rozbalit vše Re: Stibiho amatérská „příručka“ k PyGTK - díl 1
nerikam ze je, ale stejne by me zajimalo co zasadniho mas proti
Rules of Optimization: Rule 1: Don't do it. Rule 2 (for experts only): Don't do it yet.
16.9.2006 19:42 Petr Bayer | blog: NIL
Rozbalit Rozbalit vše Re: Stibiho amatérská „příručka“ k PyGTK - díl 1
proti glade nemam nic, je to supr vec, ale predtim je dobre znat pygtk.
a jinak, uz mame nove glade, ktere je tak trochu dost odlisne od toho stareho a to uz radsi nemluvim o gtk, takze nektere veci ze starsich tutorialu nebudou fungovat. a to pak je velka legrace resit "proc to ksakru nejde, kdyz jsem to zkopiroval z toho navodu", vyborne se na tom uci.
Kill the poor!
16.9.2006 20:18 rajcze | skóre: 6 | blog: rajcze | kus od Brna
Rozbalit Rozbalit vše Re: Stibiho amatérská „příručka“ k PyGTK - díl 1
nove glade ke me jeste nedorazilo, asi se budu muset podivat :)
"proc to ksakru nejde, kdyz jsem to zkopiroval z toho navodu"
hehe, tak to mas naprostou pravdu, jen by se mi opravdu nelibilo, kdyby me nekdo strasne sepsul ze to podle myho navodu nefunguje a pak se zjistilo ze je to kvuli jine verzi glade
Rules of Optimization: Rule 1: Don't do it. Rule 2 (for experts only): Don't do it yet.
16.9.2006 21:57 Petr Bayer | blog: NIL
Rozbalit Rozbalit vše Re: Stibiho amatérská „příručka“ k PyGTK - díl 1
16.9.2006 21:58 Petr Bayer | blog: NIL
Rozbalit Rozbalit vše Re: Stibiho amatérská „příručka“ k PyGTK - díl 1
jen by se mi opravdu nelibilo, kdyby me nekdo strasne sepsul ze to podle myho navodu nefunguje a pak se zjistilo ze je to kvuli jine verzi glade
to vetsinou lidem dochazi az potom :-D
Kill the poor!
16.9.2006 16:41 Petr "Glubo" Sýkora | skóre: 21 | blog: Glubnik
Rozbalit Rozbalit vše Re: Stibiho amatérská „příručka“ k PyGTK - díl 1
Odpovědět | Sbalit | Link | Blokovat | Admin

Nakonec to dopadlo docela pěkně ;)

Jen takový malý hint k psaní tagů <pre> zde na Ábíčku: když přidáš parametr class="kod", zobrazí se pak jako úryvky kódů v článcích, tedy v barevně odlišeném bloku.

„O mrtvých jen v dobrém." „Pojďme se bavit o Stalinovi."
Martin Stiborský avatar 16.9.2006 16:46 Martin Stiborský | skóre: 26 | blog: Stibiho bláboly | Opava
Rozbalit Rozbalit vše Re: Stibiho amatérská „příručka“ k PyGTK - díl 1
Díky, upravím, opravím :)
Kvík ..
Vojta Drbohlav avatar 16.9.2006 18:06 Vojta Drbohlav | skóre: 26 | blog: Blog | Strahov
Rozbalit Rozbalit vše Re: Stibiho amatérská „příručka“ k PyGTK - díl 1
Odpovědět | Sbalit | Link | Blokovat | Admin
Nečet sem to celý, ale podle mě by z toho byl pěknej článek ;-)
Jardík avatar 16.9.2006 23:09 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Stibiho amatérská „příručka“ k PyGTK - díl 1
Odpovědět | Sbalit | Link | Blokovat | Admin
Měl bych jen takovou malou výtku. Do toho zdrojáku příště nepiš ty čísla řádek, špatně se to kopíruje :)
Věřím v jednoho Boha.
17.9.2006 14:04 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: Stibiho amatérská „příručka“ k PyGTK - díl 1
Špatně? :1,$s/^(\d*)// není až tak těžké ;-).
When your hammer is C++, everything begins to look like a thumb.
Martin Stiborský avatar 17.9.2006 12:34 Martin Stiborský | skóre: 26 | blog: Stibiho bláboly | Opava
Rozbalit Rozbalit vše Re: Stibiho amatérská „příručka“ k PyGTK - díl 1
Odpovědět | Sbalit | Link | Blokovat | Admin
Jestli by měl někdo nápad na něco konkrétního, o čem by se mohlo napsat, ať se ozve ju ?! :)
Kvík ..

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.