Sveu£ili²te J.J.Strossmayera u Osijeku Odjel za matematiku...

31

Transcript of Sveu£ili²te J.J.Strossmayera u Osijeku Odjel za matematiku...

Sveu£ili²te J.J.Strossmayera u Osijeku

Odjel za matematiku

Sveu£ili²ni preddiplomski studij matematike

Dino Vu£emilovi¢- �imunovi¢Implementacija gra�£kog su£elja u Pythonu koriste¢i

bibiloteku wxPython i rad s HTTP protokolom

Zavr²ni rad

Osijek, 2011.

Sveu£ili²te J.J.Strossmayera u Osijeku

Odjel za matematiku

Sveu£ili²ni preddiplomski studij matematike

Dino Vu£emilovi¢- �imunovi¢Implementacija gra�£kog su£elja u Pythonu koriste¢i

bibiloteku wxPython i rad s HTTP protokolom

Zavr²ni rad

Mentor:doc.dr.sc. Domagoj Matijevi¢

Osijek, 2011.

Saºetak

Dana²nje vrijeme zahtjeva da ra£unalne aplikacije uz visoku razinu funkcionalnosti imajujednako kvalitetno korisni£ko gra�£ko su£elje. Izgled aplikacije je prvo ²to ¢e korisnik uo£itikod susreta s aplikacijom. Zato je bitno da gra�£ko su£elje bude smisleno organizirano,e�kasno i pristupa£no. Ako to ne postignemo, postoji mogu¢nost da korisnik uop¢e ne¢eºeljeti koristiti na²u aplikaciju i da ¢e posegnuti za nekom drugom, funkcionalno lo²ijom,samo zbog boljeg izgleda. Isto tako, ve¢ina poslova je danas nezamisliva bez Interneta. Poz-navanje HTTP protokola i kori²tenje istog neophodno je kako bi mogli iskusiti sve prednostiglobalnog umreºavanja putem Interneta.

Klju£ne rije£i

Internet, HTTP, Python, wxPython, gra�£ko korisni£ko su£elje, aplikacija, prozor

Abstract

Nowadays people require computer applications with a high level of functionality to havethe same level of quality user interface. Appearance of the application is �rst thing userswill notice while meeting with the application. That's why it's important that the graphicalinterface is sensibly organized, e�cient and a�ordable. If we fail to achieve this, there ispossibility that user will reach for the other, functionally poorer application, just for betterlook. Also, the most of the jobs today are closely related to the Internet, so knowledge ofHTTP protocol and using it is necessary in order to experience all the bene�ts of globalnetworking trough the Internet.

Key words

Internet, HTTP, Python, wxPython, graphical user interface, applications, window

1

Sadrºaj

1 Uvod 3

2 Python i wxPython 4

2.1 Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.2 wxPython . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

3 Kreiranje gra�£kog su£elja koriste¢i wxPython 6

3.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63.2 Aplikacijski objekt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73.3 Prozor najvi²e razine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

4 HTTP protokol u Pythonu 14

4.1 HTTP protokol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144.2 HTTP i Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

5 Implementacija vlastite aplikacije 21

6 Zaklju£ak 27

7 Literatura 28

8 Prilog - popis slika 29

2

1 Uvod

Ra£unala u dana²njem svijetu zauzimaju sve ve¢u ulogu u ºivotu ljudi, pa je vrlo vaºnoimati kvalitetne ra£unalne progame i aplikacije. Korisnik ra£unalnog programa prvo uo£avanjegovo gra�£ko su£elje i upravo zbog toga je preporu£ljivo da ono bude pregledno i logi£kiposloºeno. Ukoliko su£elje nije pregledno, moºe djelovati odbojno na korisnika i natjerati gada posegne za drugom aplikacijom, £ime programer gubi klijente. Iz tog razloga programerimoraju postaviti £vrste temelje svom gra�£kom su£elju i pripaziti da glavne funkcionalnetipke budu dobro vidljive i nadohvat ruke korisniku. Kako se ve¢ina poslova danas obavljaputem Weba, nuºno je da programeri poznaju i HTTP protokol, osnovni protokol razmjenepodataka na Webu. Prvotna verzija HTTP-a je sadrºavala samo GET metodu koja je slalazahtjev serveru za dohva¢anjem HTML dokumenta. Dana²nji broj HTTP metoda iznosidevet, a sve te metode povla£e eventualne pogre²ke koje se mogu pojaviti pri kori²tenjuistih. Zato je bitno da programer dobro poznaje HTTP protokol kako bi mogao napravitiaplikaciju koja ¢e biti imuna na probleme koji se mogu javiti u komunikaciji sa serverima ilikori²tenju HTTP metoda. Programer s takvim znanjem je na korak do kreiranja kvalitenihposlovnih aplikacija koje ¢e korisnici znati cijeniti.

Ovaj rad je podijeljen u osam dijelova: Uvod, Python i wxPython, Kreiranje gra�£kogsu£elja koriste¢i wxPython, HTTP protokol u Pythonu, Implementacija vlastite desktopaplikacije, Zaklju£ak, Literatura, Prilog - popis slika.

Prvo ¢emo se upoznati s programskim jezikom Python, a potom i wxPython alatom zakreiranje gra�£kog su£elja u Pythonu. Objasniti ¢emo osnovne klase koje koristimo i naprav-iti nekoliko primjera kreiranja jednostavnih prozora s gumbovima. Nakon upoznavanja skreiranjem gra�£kog su£elja, upoznati ¢emo se s HTTP protokolom i njegovim kori²tenjemu Pythonu.

Isto tako ¢emo implementirati jednu vlastitu Pyhton aplikaciju s jednostavnijim, alipreglednim gra�£kim su£eljem. Ta aplikacija ¢e koristiti HTTP protokol za dohva¢anjeodre�enih podataka web stranica, tako da ¢emo na vi²oj razini primjeniti svu teoriju kojusmo ranije naveli. Ve¢ina teksta ¢e biti propra¢ena ilustracijom pomo¢u slika i pripadnimprogramskim kodom. Cilj je da £itatelj, nakon upoznavanja s ovim radom, dobije kvalitetnupozadinu za izradu vlastite aplikacije s preglednim gra�£kim su£eljem.

3

2 Python i wxPython

2.1 Python

Python jer interpreterski, interaktivni, objektno orjentirani programski jezik. On spadau grupu jezika visoke razine, ²to zna£i da koristi prirodnije jezi£ne elemente kako bi omogu¢iojednostavniji i £itljiviji razvitak programa.

Povijesno gledano, razvoj Pytona zapo£eo je jo² 1989. godine od strane nizozemskogprogramera Guida van Rossuma kao nasljednik ABC programskog jezika. Do kraja 1998.godine, Python je imao bazu od 300.000 korisnika, a od 2000. godine ve¢ su ga prihvatileustanove kao ²to su MIT, NASA, IBM, Google, Yahoo i druge. Python ne donosi nikakverevolucionarne zna£ajke u programiranju, ve¢ objedinjuje sve najbolje ideje i na£ela rada izdrugih programskih jezika. Upravo zbog toga je on istovremeno jednostavan i snaºan. Ksvemu tome Python je besplatan, open-source program s izvrsnom potporom, literaturom idokumentacijom.

Python nudi slijede¢e napredne zana£ajke: objektu orjentirano programiranje s vi²estrukimnaslije�ivanjem, dohva¢anje izuzetaka ili iznimki, rede�niranje standardnih operatora, pret-postavljene argumente, prostore imena, module i pakete, £ime objedinjuje sve stvari koje seo£ekuju od modernog programskog jezika.

S druge strane, sintaksa jezika je jednostavna. Uvlake zamjenjuju posebne znakove zade�niranje blokova koda, pa je napisani program vrlo jednostan za £itanje. To moºemovidjeti na slijede¢em primjeru:

Slika 1. Primjer programa u Pythonu

4

Pytohonova knjiºnica (engl. library), koja uklju£uje standardnu instalaciju, sadrºi preko200 modula, ²to pokriva sve od funkcija operacijskog sustava pa do struktura podatakapotrebnih za izgradnju web servera. Posebno dobro je prilago�ena za pisanje Intenet ap-likacija, s velikim brojem standardnih formata i protokola kao ²to su npr. MIME i HTTP.U slu²aju da nam standardna knjiºnica ipak nije dovoljna, glavni Pythonov web sitewww.python.org nudi saºeti index mno²tva drugih Python projekata i razli£itih knjiºnica.

Guido van Rossum, kao glavni autor, do dana²njeg dana zauzima centralnu ulogu urazvijanju Python programskog jezika i u odlukama kamo ¢e se razvoj usmjeravati, pa jetako od strane Python zajednice dobio poznatu titulu �Dobronamjerni diktator za ºivot�.

Za one koji nemaju iskustva s programiranjem u Pythonu a ºeljeli bi nau£iti ne²to vi²e,na slijede¢oj web stranici mogu prona¢i knjigu koja ih korak po korak uvodi u svijet Pythona:diveintopython3.org. U nastavku ¢emo biti vi²e orijentirani na stvaranje gra�£kog su£eljai radom s http protokolom , umjesto osnovama samog programskog jezika Python.

2.2 wxPython

Python je sam po sebi vlo mo¢an programski jezik, ali kako bi dobiveni programi bili pot-puni i jednostavni za kori²tenje od strane krajnjeg korisnika potrebno je adekvatno gra�£kosu£elje. U tu svrhu upoznati ¢emo se s wxPython-om.

wxPython je �alat� za konstruiranje gra�£kog korisni£kog su£elja (GUI- graphical userinterface) u Pythonu. On omogu¢ava programerima izradu programa s robusnim, visokofuncionalnim gra�£kim su£eljem, ali na vrlo jednostavan i lak na£in.

Sami po£eci wxPython-a seºu od 1995. godine, kada je programer Robin Dunn na posludobio projekt da razvije gra�£ko korisni£ko su²elje (u daljnjem tekstu korisiti ¢emo izrazGUI) za HP-UX sisteme, ali isto tako i za windows 3.1. Istraºivaju¢i i traºe¢i C++ GUI alatza vi²e platformi s kojim bi mogao odraditi projekt, nai²ao je na pojam �Python vezovi� naweb stranicama wxWidgets-a (wxWidgets - besplatan alat za razvoj GUI-a na vi²e razli£itihplatformi). Iz radoznalosti kako se moºe vezati softverski alat za reptila, gmaza (Python-engl. Piton, zmija) krenuo je prou£avati vi²e o Pythonu i nakon nekoliko klikova na poveznice,zavr²io je na jednostavnoj literaturi o samom programskom jeziku. U samo nekoliko sati odC++ gurua, postao je veliki zagovara£ Pythona jer je otkrio koliko je odli£an i prakti£annjemu novootkriveni programski jezik. Upravo tada je donio kona£nu odluku da ¢e umjestona prvotnom projektu na poslu, po£eti raditi na vezanju Pythona za wxWidgets GUI alat,te tako dobiti wxPython kojim bi na kraju mogao izvr²iti svoj prvotni zadatak na vi²eplatformi. U tome mu je puno pomogao Harri Pasanen. Uz poneke pote²ko¢e i zastoje urazvoju ideje, Robin i Harri tek 1998. izdaju prvu, gotovu, �modernu� verziju wxPythona,nakon £ega kre¢e njegov aktivni razvoj i distribucija sve do danas.

5

3 Kreiranje gra�£kog su£elja koriste¢i wxPython

3.1 Uvod

Za po£etak, ukoliko ve¢ nismo, potrebno je skinuti i instalirati programski paket wx-Python sa sluºbene stranice www.wxpython.org za pripadni operativni sustav ra£unala kojese koristi.

Nakon instalacije obavezno je pri programiranju, me�u ostalim biblioteka koje eventualnouvodimo, uvesti glavni wxPython paket, koji je u Pythonu imenovan s wx na slijede¢i na£in:

import wx

Kada je paket uveden, dalje se moºemo pozivati na wxPthon klase, funkcije i konstantekoriste¢i ime paketa wx kao pre�ks. Primjer: class App(wx.App). Bitna stvar na kojukorisnici moraju obratiti pozornost je da se paket wx mora uvesti prije nego se uvodi bilo ²todrugo iz wxPythona. Nakon prvotnog uvo�enja wx paketa, ostali moduli se mogu uvoditibilo kojim redoslijedom.

Kao ²to je temelj ku¢e betonska struktura koja £ini £vrstu bazu za ostatak konstrukcije,isto tako wxPython ima svoj temelj. Taj temelj £ine dva objekta koja podupiru ostatakaplikacije. To su application object (aplikacijski objekt) i top-level window object

(objekt prozora najvi²e razine). Kako bi jednostavnije i e�kasnije konstruirali aplikaciju,bitno je da upravo ta dva objekta budu propisno kori²tena.

Aplikacijski objekt upravlja glavnom petljom, pokre¢e ju i donosi krajnje odluke kakav ¢ebiti odgovor na eventualne doga�aje, bilo od strane programa ili korisnika. Bez ovog objekawxPython aplikacija ne moºe postojati, niti se bez njega moºe kreirati gra�£ki objekt.

Objekt prozora najvi²e razine upravlja najvaºnijim podacima i kontrolama, te ih prezen-tira korisniku. Kao konkretan primjer, uzmimo glavni prozor web pretraºiva£a, koji istovre-meno prikazuje web stranicu, nudi nam odre�ene kontrole, a s web stranicom upravlja kaopodatkovnim objektom.

Kako bi predo£ili vezu izme�u ta dva objekata, promotiti ¢emo Sliku 2 koji nam prikazujekako aplikacijski objekt 'posjeduje' objekt prozora najvi²e razine i doga�aj glavne petlje.Prozor najvi²e razine upravlja komponentama samog prozora i podatkovnim objektima kojisu vezani za njega. Taj prozor i njegove komponente pokre¢u doga�aje na temelju aktivnostikorisnika i primaju obavijesti kakve promjene da vr²e na samom zaslonu.

6

Slika 2. Funkcioniranje aplikacijskog objekta i objekta prozora najvi²e razine(preuzeto iz [5] slika 2.1)

3.2 Aplikacijski objekt

Svaka wxPython aplikacija mora imati to£no jedan aplikacijski objekt, dok aplikacijskiobjekt mora biti dio wx.App klase ili prilago�ene podklase. Roditeljska klasa wx.App de�niranekoliko svojstava koje su globalne za cijelu aplikaciju. Naj£e²¢e ¢e ta svojstva biti dovoljnaza sve na²e potrebe funkcionalnosti aplikacijskog objekta. Ali ukoliko nisu, primjerice kadaºelimo upravljati drugim globalnim podacima ili vezama s npr. bazama podataka, moºemokoristi prilago�enu aplikacijsku podklasu.

Kreiranje vlastite prilago�ene podklase od wx.App je toliko jednostavno, da je £estopoºeljno kreirati ju na po£etku aplikacije iako moºda ne trebamo prilago�enu funkcionalnost.Na taj na£in, imati ¢emo podklasu u slu£aju da nam bilo kod kasnije zatreba u programu.Kreiranje wx.App podklase odvija se u £etiri koraka:

• De�nirati podklasu

• Napisati OnInit() metodu unutar de�nicije podklase

• Kreirati instancu klase u glavnom dijelu programa

• Pozvati MainLoop() metodu aplikacijske instance. Ova metoda prenosi kontrolu pro-grama do wxPythona

7

Slika 3. Kreiranje podklaze od wx.App(preuzeto iz [5])

OnInit() je metoda koja se poziva od strane wxPython sistema kada je pokrenuta ap-likacija i prije nego se pokrene petlja glavnog doga�aja. Ova metoda ne prima parametre, avra¢a boolean vrijednost. Ako je boolean laºne vrijednosti dolazi do automatksog izlaska izsame aplikacije. Zato naj£e¢e ºelimo istinu kao izlaznu vrijednost, dok je laº dobra ukolikodo�e do odre�enih gre²aka u programu, kao ²to je na primjer nedostatak traºenih resursa.Umjesto OnInit() metode koja je dio wxPython frameworka moºemo koristiti i Pythonovuspecijalnu__init__ metodu na inicijaliziranje novokreiranog objekta. Ako se odlu£imo zato onda ju pozivamo na slijede¢i na£in: wx.App.__init__(self)

�ivotni vijek aplikacijskog objekta po£inje kada je instancija aplikacije kreirana, a za-vr²ava nakon ²to je zadnji prozor aplikacije zatvoren. To nuºno ne zna£i da ¢e po£etak i krajPython skripte koja okruºuje wxPython aplikaciju biti isto tako odre�eni. Skripta moºeraditi prije kreiranja wxPython aplikacije, a nakon ²to MainLoop() (glavna petlja) zavr²imoºe isto tako odraditi daljnje £i²¢enje. Ali s druge strane, sve wxPython radnje morajubiti izvr²ene za ºivota aplikacijskoj objekta, jer u suprotnom dolazi do pogre²ke.

Na slijede¢oj slici moºemo pojednostavljeno vidjeti navedeni proces: aplikacijski objektaktivira OnInit() metodu i omogu¢uje kreiranje novih objekata prozora. Nakon OnInit()

metode skripta poziva MainLoop() koja upravlja wyPython doga�ajima. Nakon ²to su sviprozori najvi²e razine zatvoreni, aplikacijski objekt se isto tako zatvara, te skripta moºezatvoriti ostale veze koje eventualno postoje.

Slika 4. Redoslijed izvr²avanja u Pythonu(preuzeto iz [5] slika 2.2)

8

Ako iz odre�enog razloga ºelimo da se na²a aplikacija nastavi nakon ²to se posljednjiprozor zatvori moºemo iskoristiti wx.App metodu SetExitOnFrameDelete(�ag). Ako je vri-jednost parametra �ag postavljena na False, program ¢e nastaviti raditi £ak i ako su sviprozori zatvoreni. U tom slu£aju instancija wx.App ¢e nastaviti ºivjeti, pa moºemo prim-jerice kreirati novi prozor najvi²e razine. U tom slu£aju aplikacija nastavlja s radom dokgod eksplicitno ne pozovemo globalnu funkciju wx.Exit() koja ¢e ozna£iti kraj.

3.3 Prozor najvi²e razine

Prozor najvi²e razine je widget (obi£no je to okvir koji se prikazuje na zaslonu) koji nijesadrºan niti u jednom drugom widgetu u samoj aplikaciji. U praksi je to naj£e¢e ono na ²to¢e korisnik uperiti prstom na monitoru i re¢i: 'Ovo je program'. Prozor najvi²e razine jeglavni prozor koji sadrºi druge widgete i objekte su£elja s kojima korisnik ima interakciju.Svaka aplikacija mora imati najmanje jedan prozor najvi²e razine, ali isto tako moºe ih imatiproizvoljno mnogo. On je podklasa od wx.Frame ili wx.Dialog klase (Dijalo²ki okviri).

Frame je u grubom opisu okvir kojeg korisnik moºe slobodno micati ekranom i kojinaj£e²¢e uklju£uje naslovnu traku, traku izbornika i opcije mjenjanja veli£ine u uglovima.Klasa wx.Frame je roditeljska klasa svih frameova u wxPythonu. Kada konstruiramo frame,odnosno kreiramo podklasu od wx.Frame, __init__() metoda mora pozvati roditeljskogkonstruktora wx.Frame.__init__(). Potpis tog konstruktora pogledajmo na slijede¢oj slici:

Slika 5. Konstruiranje okvira(preuzeto iz [5])

Ovaj konstruktor uzima nekoliko parametara kao ²to su parent, pos, size, id, itd. Pa¢emo ih redom de�nirati kako bi znali ²to trebamo zadati kako bi dobili ºeljeni okvir, odnosnoprozor:

• parent - ovaj parametar govori postoji li roditeljski prozor kojemu je na² podre�en.Ukoliko ne postoji vrijednost je None, ²to ujedno zna£i da je to prozor najvi²e razine

• id - identi�kacijski broj na²eg prozora. Ako ga ne ºelimo eksplicitno odrediti, postavimovrijednost -1 ²to zna£i da ¢e wxPython automatski sam generirati novi ID.

• title - naslov. Naj£e²¢e je prikazan u naslovnoj traci prozora

9

• pos - wx.Point klasa koja odre�uje gdje ¢e se na zaslonu nalaziti na² kreiran prozor

• size - wx.Size klasa koja odre�uje po£etnu veli£inu na²eg prozora.

• style - de�nira odre�eni stil samog prozora

• name - interno ime okvira, ²to zna£i da nam moºe posluºiti kako bi u daljenjem pro-gramiranju mogli prona¢i ve¢ de�nirani prozor

Ovi parametri su proslije�eni roditeljskoj konstruktorskoj metodi wx.Frame.__init__(),ali argumenti potpisa samog konstruktora naj£e¢e ¢e u na²im klasama biti razli£iti. To namnpr. omogu¢ava da postavimo konkretne vrijednosti na²eg prozora tako da ne dopustimo dase vi²e mjenjaju, tj da konstruktor trazi parametre. Uzmimo za primjer veli£inu prozora,koju moºemo postaviti da uvijek bude 450x450 pixela bez mogu¢nosti naknadne promjene.

Kako se £esto koriste klase wx.Size i wx.Point moºemo istaknuti da su one po konstruk-ciji dosta sli£ne. Klasa wx.Point koja odre�uje poziciju, za argumente uzima parametre x

i y, koji reprezentiraju koordinate to£aka na zaslonu. Ako ne postavimo vrijednost jednogod njih, standardno ¢e wxPython postaviti na vrijednost 0. Primjer zadavanja pozicije:point=wx.Point(50,100). Klasa wx.Size je skoro identi£na klasi wx.Point, osim nazivasamih varijabli, koje sada imenujemo width i height umjesto x i y koje reprezentiraju ²irinui visinu prozora.

Kako bi korisnik mogao imati interakciju, na frame je potrebno umetnuti objekte i wid-gete. To mogu biti trake izbornika, gumbovi, alatne trake, checkboxovi, radio buttoni, listboxovi, umetnute slike ili polja za unos odre�enih podataka od samog korisnika na traºeniupit. Mogu¢nosti su brojne jer wxPython osigurava programerima pregr²t alata kako bimogi kreirati gra�£ko su£elje aplikacije kakvu god oni zamisliti. Mi ¢emo obraditi jednos-tavan primjer dodavanja gumba na kreirani panel i pridruºivanja odre�ene funkcionalnostisamom gumbu. Na slijede¢im dvjema slikama moºemo prvo vidjeti kako ¢e u izgledati na²prozor a zatim kod same aplikacije, koji ¢emo detaljnije prou£iti:

Slika 6. Jednostan primjer kreiranja i popunjavanja framea(preuzeto iz [5] slika 2.8)

10

Slika 7. Jednostan primjer kreiranja i popunjavanja framea (kod)(preuzeto iz [5] primjer 2.3)

Prou£imo kod redom: prvo smo uveli wxPython paket naredbom import wx, a zatimde�nirali klasu InsertFrame kao podklasu od wx.Frame. __init__ metodom te klase smode�nirali dva nova podprozora. Kao ²to moºemo vidjeti iz koda, prvi je wx.Panel a drugiwx.Button. wx.Panel sam po sebi ima jako malu funkcionalost, pa njega moºemo pre-do£iti kao obi£an spremnik za ostale potprozore. Naj£e²¢e ºelimo da on bude iste veli£inekao pripadni mu wx.Frame kako bi mogao sarºavati sve elemente frame-a. Standardno jenamje²etno u Pythonu da ako ne unesemo veli£inu wx.Panela Python ¢e ju zadati istu kao²to je veli£ina pripadnog roditeljskog framea upravo iz razloga kojeg smo spomenuli. Zatimimamo uvedeni wx.Button koji reprezentira klasi£ni gumb koji se pojavljuje na prozoru. Kaonjegove parametre proslijedili smo roditeljski prozor, naziv koji ¢e se prikazati na gumbu,poziciju gdje ¢e se pojaviti i veli£inu samog gumba.

Naravno svrha gumba je da ga korisnik pritisne kako bi pokrenuo odre�eni proces,odnosno kako bi gumb sam po sebi imao nekakvu funkcionalnost. Kako bi dobili takvufunkcionalnost koristiti ¢emo metodu bind koja navedeni doga�aj veºe za wxPthon. Tomoºemo vidjeti u gornjem primjeru. Nakon ²to smo doga�aje vezali, (doga�aji su u ovomslu£aju pritisak na kreirani gumb close i izlazak iz samog prozora) de�niramo navedenepridruºene klase kako bi mogli egzaktno odrediti ²to ºelimo da Python radi kada do�e doodre�enog doga�aja. U na²em primjeru je to bilo trivijalno: zatvaranje prozora i izlazak izaplikacije. Zatim smo u nastavku samo pozvali glavnu petlju koriste¢i MainLoop().

11

wxPthon biblioteka nam nudi bogati set prede�niranih dijalo²kih okvira koje na²im ap-likacijma mogu dati prepoznatljivi izgled i doºivljaj. Tako postoje 3 na£ina kojim moºemodo¢i do informacije od strane korinika korite¢i dijalo²ke okvire: dijalog porukom, unos tekstaili izabiranjem s liste. Naj£e²¢e se koristi dijalog porukom pa ¢emo njega pobliºe objasniti.

Dijalo²ki okvir poruke sadrºan je u klasi wx.MessageDialog i upravo nju ¢emo koristitiza kreiranje istog. Pojednostavljeno, dijalo²ki okvir poruke je mali prozor koji se pojavljujena na²em zaslonu i obi£no sarºi nekakvu kratku obavijest. Tako imamo dvije vrste dijalogaporukom: OK dijalo²ki okvir i YES/NO dijalo²ki okvir, koji su odre�eni upravo po gum-bovima koji se pojavljuju na samom okviru odnosno prozoru. Pogledajmo primjer YES/NOdijalo²kog okvira:

Slika 8. YES/NO dijalo²ki okvir(preuzeto iz [5] slika 2.10)

Slika 9. Kod za kreiranje dijalo²kog okvira(preuzeto iz [5])

Pri konstrukciji koda vidimo da smo koristili konstruktor dialoga wx.MessageDialog ko-jem proslije�ujemo roditeljski prozor (ukoliko postoji), tekst koji ¢e se prikazati u dijalo²komokviru, naziv samog okvira, gumbovi koji ¢e biti smje²teni u dijalo²ki okvir i stil samogokvira. Jedino ²to bi jo² mogi pojasniti je sam stil koji je u ovom slu£aju ICON_QUESTION.Dakle, stil dijalo²kog okvira nam govori kakva je poruka koju okvir sadrºi. Ako je onaupitnog karaktera onda stavljamo ICON_QUESTION i kraj na²eg pitanja naj£e²¢e dobijemosli£icu upitnika, ako je sadrºaj nekakav uzvik ili upozorenje stavljamo ICON_EXCLAMATION

i dobivamo sli£icu uskli£nika, a ako je sadrºaj isklju£ivo informativne prirode, stavljamoICON_INFORMATION.

12

Kada sve sumiramo upoznali smo se s izgradnjom i postavljanjem temelja wxPythonaplikacije. Svi ostali alati kao ²to su podijeljeni zasloni, razli£ite tipke i izbornici lako senadopune na ovu konstrukciju jer sada bi trebali znati logiku funkcioniranja gra�ke u pythonui upravljanjem doga�ajima. Kako tih alata ima mno²tvo, po potrebi moºemo potraºitinama potrebni alat na sluºbenim stranicama wxPythona kako bi se upoznali sa samomimplementacijom i osnovnim svojstvima. Iako ¢emo jo² neke od njih upoznati do kraja ovograda, u prakti£nom dijelu.

13

4 HTTP protokol u Pythonu

4.1 HTTP protokol

HTTP (Hypertext Transfer Protocol) je mreºni protokol koji je osnova razmjene podatakana Webu. Standard HTTP-a razvijao se pod nadzorom IETF-a (Internet Engineering TaskForce) i W3C-a (World Wibe Web Consortium) i dosegnuo je vrhunac objavom niza RFCs-a (Request for Comments) od kojih je najzna£ajniji RFC 2616 objavljen u lipnju 1999.godine koji de�nira verziju HTTP-a koja je u ²irokoj upotrebi, verziju HTTP/1.1. Povi-jesno gledano, engleski �zi£ar Tim Bernes- Lee osnovao je projekt "World Wide Web" tesu on i njegov tim zasluºni za nastanak izvornog HTTP protokola (HTTP V0.9), HTML-a,tehnologije potrebne za web servere i web pretraºiva£e. Prvotna verzija sadrºavala je samojednu metodu, GET metodu koja je serveru slala zahtjev za odre�enom stranicom, a odgovorservera je uvijek bila HTML stranica

Protokol se tokom godina unaprije�ivao; pro²iren je dodatnim operacijama i sigurno²¢ute je postao u£inkovitiji. RFC 1945 sluºbeno je predstavio HTTP V1.0 1996. godine. Te istegodine pu²tena je i HTTP/1.1 verzija koju je do lipnja 1996. koristilo 65% web pretraºiva£a.Sluºbena HTTP/1.1 verzija iza²la je u sije£nju 1997., a dopunjenu verziju objavio je RFC2616 u lipnju 1999. godine.

HTTP je request/response (zahtjev/odgovor) protokol za komunikaciju izme�u klijentai posluºitelja (servera). Kod HTTP-a, npr. web pretraºiva£ (browser) djeluje kao klijentdok program na ra£unalu koje je nositelj web stranice koju potraºujemo djeluje kao server.Klijent ²alje HTTP zahtjev, tj. poruku serveru, koji posjeduje podatke (izvore) kao ²to suHTML datoteke i ima mogu¢nost proslje�ivanja tih podataka, koji vra¢a odgovor klijent.Odgovor sadrºi status izvr²enja zahtjeva te u tijelu poruke moºe sadrºi podatke koje jeklijent zatraºio. HTTP podaci (resources, izvori) se pronalaze i identi�ciraju pomo¢u URI-a (Uniform Resource Identi�ers) i URL-a (Uniform Resource Locators) koji su, zajedno sHTML-om (Hypertext Markup Language), tokom '90-tih doveli do stvaranja World WideWeba. Izvorna verzija HTTP-a, HTTP/1.0, unaprije�ena je u verziju HTTP/1.1 koja moºekoristiti jednu konekciju na server nekoliko puta za razliku od verzije HTTP/1.0 koja jekoristila odvojene konekcije na server za svaku request/response razmjenu. Time je smanjenovrijeme £ekanja prilikom uspostavljanja TCP konekcije.

HTTP razmjena podataka sastoji se od niza request/response poruka. HTTP klijentpokre¢e zahtjev tako ²to uspostavlja TCP konekciju na odre�enom portu doma¢ina (naj£e²¢eje to port 80). HTTP server koji �oslu²kuje� na tom portu £eka zahtjev klijenta te kada gaprimi, ²alje odgovor koji se sastoji od retka stanja, npr �HTTP/1.1 200 OK� i njegoveporuke koja moºe biti traºeni podatak, poruka o gre²ci ili ne²to drugo. HTTP odre�ujedevet metoda koje predstavljaju radnju koju ºelimo izvr²iti nad odre�enim izvorom. Tajizvor moºe biti stati£kog ili dinami£kog podrijetla (stati£ke ili dinami£ke web stranice) ²toovisi o implementaciji servera. Popis svih radnji koje moºemo izvr²iti nad izvorom:

14

• HEAD - potraºuje odgovor koji je identi£an GET zahtjevu, ali ne sadrºi tijelo odgovora.Ovo je korisno za dohva¢anje meta-podataka koji se nalaze u zaglavju odgovora bezpreuzimanja cijelog sadrºaja.

• GET - zahtjev za prikaz odre�enog sadrºaja izvora

• POST - dostavlja podatke izvoru koje treba obraditi (npr. iz HTML oblika). Podacise nalaze u tijelu zahtjeva. To moºe rezultirati stvaranjem novog izvora i/ili izmjenompostoje¢eg.

• PUT - u£itava prikaz odre�enog izvora

• DELETE - bri²e odre�eni izvor.

• TRACE - oda²ilje nazad primljeni zahtjev tako da klinejt moºe vidjeti promjene ilidodatke koje je postavio server posrednik.

• OPTIONS - vra¢a HTTP metode koje server podrºava za odre�eni URL. Koristi sekako bi se provjerila funkcionalnost servera tako da se ²alje '*' umjesto zahtjeva zaizvorom.

• CONNECT - pretvara konkeciju zahtjeva u TCP/IP tako ²to olak²ava SSL kriptiranukomunikaciju (HTTPS) kroz nekriptirani HTTP proxy

• PATCH - koristi se za stvaranje pojedina£nih promjena u izvoru.

Neke metode (npr. HEAD, GET, OPTIONS, TRACE) smatraju se sigurnim metodama²to zna£i da su namjenjene za dohva¢anje informacija i ne bi trebale mijenjati stanje servera,tj ne bi trebale uzrokovati promjene na stranici (osim onih bezopasnih, tipa pove¢anje broja£aposjeta web stranice). Suprotno tome, metode kao ²to su POST, PUT, DELETE uzrokujupromjene na serveru ili uzrokuju vanjske promjene kao ²to su �nancijske transakcije ili razm-jena e-maila. Unato£ sigurnosti GET zahtjeva, obrada tih zahtjeva od strane servera nijetehni£ki ograni£ena ²to zna£i da nemarnim programiranjem moºe do¢i do netrivijalnih prom-jena na serveru. Metode kao ²to su TRACE, TRACK i DEBUG smatraju se nesigurnima jerih se moºe zloupotrijebiti za prikupljanje informacija ili za zaobilaºenje sigurnosnih kontrola.

Postoje dvije metode uspostavljanja sigurne HTTP konekcije: http URI shema i HTTP/1.1Upgrade header. Pretraºiva£i uglavnom jo²e ne podrºavaju drugu metodu pa je HTTPSglavna metoda uspostavljanja sigurne konekcije. Takva konekcija ozna£ena je pre�skomhttps:// umjesto http:// u URL adresi.

Sintaksa https URI shema identi£na je sintaksi http sheme, ali ona dodatno signalizirapretraºiva£u da koristi dodatni sloj enkripcije SSL/TLS . SSL se posebno koristi za HTTP jermoºe pruºati za²titu £ak i kad je samo jedna strana koja sudjeluje u konekciji autenti�cirana²to je £est slu£aj na Internetu jer je obi£no server taj koji daje autenti�kaciju. Kod HTTP/1.1Upgrade header tokom razmjene poruka klijent zapo£inje konekciju slanje zahtjeva koji sadrºi

15

£isti tekst te kasnije ili klijent ili server mogu zatraºiti nadogradnju konekcije do TLS-a.Naj£e²¢e taj zahtjev dolazi od strane servera.

4.2 HTTP i Python

U sljede¢em dijelu poku²at ¢emo pribliºiti odre�ene stvari i navedene karakteristikeHTTP protokola s primjenom u programiranju pomo¢u Pythona. Pro¢i ¢emo nekolikometoda u HTTP-u i implementacije u Pythonu, gre²ke koje se mogu pojaviti, preusmjer-avanja stranica i postojanosti same veze sa serverom. Za po£etak de�nirat ¢emo osnovnuterminologiju.

URL su stringovi koji govore web pretraºiva£u (IE, Mozilla, Chrome) kako dohvatitiresurse s www-a (World Wide Web). Oni su podklasa potpunog skupa svih mogu¢ih URI-a, tj oni su URI-ji konstriurani tako da mogu davati intrukcije za dohva¢anje dokumentaumjesto da sluºe samo kao identi�katori. Npr. promotrimo jednostavan URL poput:

http://www.index.hr

Kada ga proslijedimo do web pretraºiva£a ovaj URL bit ¢e interpretiran tako da prvopribavi IP adresu hosta www.index.hr, ostvari TCP vezu s IP adresom na standardnom portu80, a onda zatraºi izvorni dokument koji �ºivi� na toj stranici. Primjer kompliciranijeg URL-a:

http://www.index.hr/indexrotator/items/4367/kucni%20ljubimci.jpg

Ovdje URL speci�cira vi²e informacija:

• protokol ¢e opet biti HTTP

• www.index.hr bit ¢e pretvoren u IP

• koristimo port 8080 umjesto 80

• kada se veza uspostavi, server ¢e zatraºiti izvor pod nazivom /indexrotator/items/4367/kucni

Primjetimo da svi znakovi osim alfanumeri£kih moraju biti kodirani postotkom, tj pripad-nim znakom %, a zatim dvoznamenkastim heksadecimalnim brojem jedinstveno odre�enimza svaki znak. Tu podrazumijevamo nekoliko interpunkcijskih znakova: $-_.+!*'(),- ispecijalne grani£ne znakove kao ²to je na primjer �/� (poznatije kao kosa crta). U gorn-jem primjeru (/indexrotator/items/4367/kucni%20ljubimci.jpg) pojavljuje se znak %20 ²to jeznak za razmak u URL-u, a npr. znak %2F predstavlja kosu crtu. Kako bi bolje razumjelipostotno kodiranje, promotrit ¢emo kako Python interpretira sljede¢e izraze, kako dolazi doodre�enih dijelova web adrese (komponenti putanje do traºenog izvora) te uo£iti kako oninisu ekvivalentni.

16

• kucni%2Fljubimci%2Fmacke ovo Python shva¢a kao jednu komponentu putanje do traºenogizvora

• kucni%2Fljubimci/macke ovo se interpretira kao 2 zasebne komponente putanje odvo-jene znakom �/�

• kucni/ljubimci/macke ovaj izraz se interpetira kao 3 odvojene komponente putanje dotraºenog izvora

Za razumijevanje HTTP-a u vidu Pythona nuºno je prvo de�nirati Python bibliotekuurllib2, jednu od standardnih Pythonovih datoteka koja sluºi za dohva¢anje URL-ova koris-te¢i veliki izbor protokola, a naj£e²¢e je to HTTP. Biblioteka urllib2 ima �otvara£� URL-ovakao funkciju pod nazivom urlopen(), ali kako ta funkcija odlazni zahtjev i dolazni odgovorzadrºava skrivenim, tj. nama nevidljivim tokom izvr²avanja programa mi ¢emo preuzetisljede¢i, ve¢ isprogramirani novi �otvara£� URL-a koji ¢e zapravo biti samo modi�cirana verz-ija ve¢ postoje¢e urlopen() funkcije. Jedina razlika je ²to novi de�nirani otvara£ omogu¢ujeispis odlaznih zahtjeva i dolaznih odgovora, umjesto da ih drºi prikrivenima. Novi �otvara£�URL-a de�niramo na sljede¢i na£in:

Slika 10. Novi �otvara£� URL-a(preuzeto iz [1] primjer 9-1)

Nadalje, u primjerima ¢emo ga koristiti, tj pozivati ga na sljede¢i na£in:

17

Slika 11. Pozivanje novode�niranog �otvara£a�(preuzeto iz [1] primjer 9-1)

Ovako de�niran otvara£ bit ¢e nam koristan jer moºemo prou£iti HTTP protokol i njegovopona²anje u praksi uz vi²e detalja nego ²to bi dobili funkcijom urlopen().

GET metoda bi se mogla zvati osovinom HTTP protokola. Kada je HTTP protokolnastao, imao je samo jednu funkciju, tj. GET metodu koja je imenovala i vra¢ala hy-pertext dokument od samog servera. GET metoda je prva stvar koja se prenosi kao dioHTTP zahtjeva i odmah je popra¢ena u zaglavlju samog zahtjeva. Obi£no kod jednostavnihGET metoda zahtjev zavr²ava praznom linijom koja ozna£ava kraj zaglavlja kako bi servertrenutno mogao stati s £itanjem i poslati odgovor klijentu. Promotrimo to na sljede¢emprimjeru:

Slika 12. Ilustracija pozivanja GET metode(preuzeto iz [1])

Primje¢ujemo da smo ovdje iskoristili prethodno isprogramirani �otvara£� koji nam dop-u²ta da vidimo rezultat, tj ono ²to GET metoda radi. Primjetimo da isto tako HTTPodgovor po£inje statusnom linijom koja sadrºi informacije o HTTP verziji, statusnom kodui kratku poruku (HTTP/1.1 200 OK) Kreirani info objekt nam navedene stvari iz statusnelinije moºe proslijediti kao svoje atribute, a isto tako omogu¢ava ispitivanje zaglavlja krozobjekt koji je oblikovan poput rje£nika, npr. info.code.

Dakle, osnovna svrha GET metode je potraºnja HTTP servera za odre�enim dokumen-tom kako bi se njegov sadrºaj mogao skinuti (downloadati) i naj£e²¢e prikazati na lokalnomra£unalu.

18

Kada smo razmatrali GET metodu, primjetili smo da u statusnoj liniji odgovora uzHTTP verziju imamo statusni kod i kratku poruku. U na²em slu£aju ta je poruka glasila:200 OK. �to to zna£i? Listu svih mogu¢ih odgovora moºemo prona¢i u RFC 2616, a ovdje¢emo nabrojati samo neke od mogu¢ih:

• 200 OK - zahtjev je uspio

• 301 Moved Permanently - izvoru koji se nalazio na traºenom URL-u je pridruºen noviURL koji je speci�ciran u zaglavlju HTTP odgovora. Ako imamo neke bookmarke iliostale kopije linka moºemo ih sa sigurno²¢u prepraviti na novi URL.

• 303 See Other - originalni URL moºe se i dalje koristiti za ovaj zahtjev, ali se informacijaisto tako moºe prikazati na drugom URL-u. On se opet nalazi u zaglavlju odgovora

• 304 Not Modi�ed - u ovom slu£aju i odgovor 200 OK bi bio zadovoljavaju¢i, ali ovaporuka nam govori da klijent ve¢ posjeduje aºuriranu kopiju izvora kojeg traºi, tj nemapromjena od zadnjeg preuzimanja, tako da ¢e odgovor sadrºavati samo zaglavlje, bezprijenosa tijela poruke

• 404 Not Found - URL ne imenuje valjan izvor

• 500 Initial Server Error - web stranica je "pokidana" ²to moºe biti posljedica pro-gramerske pogre²ke, kon�guracijskih problema ili nemogu¢nosti pristupa izvorima

• 503 Service Unavailable - gre²ka ukazuje da HTTP zahtjev ne moºe biti ispunjen zbogneke privremene gre²ke. Najbolji primjer ove gre²ke Twiterovim korisnicima je FailWhale.

Preusmjeravanja su vrlo £esta na webu. Npr. savjesni web programeri prilikom izradevelikog redizajna neke stranice naj£e²¢e ostave kôd 301 na sve svoje stare URL-ove kakone bi drugima uni²tili bookmarke, vanjske linkove ili rezultate pretraºivanja koji jo² uvi-jek pokazuju na njih. Isto tako broj preusmjeravanja se znatno pove¢ava kod odre�enihweb stranica koje imaju preferirana imena posluºitelja koja ºele prikazati korisnicima, alitako�er omogu¢avaju korisnicima da unosom nekog od razli£itih imena posluºitelja uspijupristupiti ºeljenoj stranici. Kako bi ilustrirali zadnju tvrdnju, promotrimo npr slu£aj Google-a. Google preferira da njegovo ime stranice po£inje s www pa ako poku²amo otvoriti stranicugoogle.com bit ¢emo preusmjereni na stranicu preferiranu od strane samog Google-a tj. nawww.google.com. Konkretan primjer iz Pythona uz pomo¢ na²eg prede�niranog �otvara£a�je:

19

Slika 13. Primjer preusmjeravanja(preuzeto iz [1])

U ovom slu£aju urllib2 datoteka odradila je preusmjeravanje za nas tako da odgovorprikazuje samo kona£ni kod: 200 OK.

U HTTP 1.1 serveri ¢e standardno ostaviti otvorenu TCP konekciju £ak i nakon ²todostave svoj odgovor. Ovo je korisno jer nam omogu¢ava stvaranje dodatnih zahtjeva naistom socketu uz izbjegavanje kreiranja novog socketa za svaki podatak koji ºelimo skinuti(downloadati).

U biblioteci urllib2 imamo klasu HTTPConnection koja iskori²tava prednosti ovog svo-jstva. U su²tini, kad koristimo funkcije kao ²to su urlopen() ili open() na objektu "otvara£a",klasa HTTPConnection se stvara u pozadini, tako da ju ni ne vidimo. Ona je zatim isko-ri²tena za jedan zahtjev, a potom odba£ena. Ako ¢emo imati vi²e upita na istu stranicu,bilo bi korisno zbog toga koristiti stalnu konekciju, kao ²to moºemo vidjeti na sljede¢emprimjeru.

Slika 14. Postojanost veze(preuzeto iz [1])

20

5 Implementacija vlastite aplikacije

Za prakti£ni dio i primjenu nau£enog o wxPythonu i HTTP protokolu u Pythonu kreirati¢emo jednu desktop aplikaciju. Ispiracija za konkretno ovu aplikaciju do²la je iz prou£avanjapotreba studenata Odjela za matematiku u Osijeku kroz akademsku godinu. Dakle, o £emuje rije£? Studenti imaju problema s pra¢enjem obavijesti na fakultetu jer ne postoji centralniservis koji ¢e im svaki put javiti ukoliko do�e do nekakve promjene, bili to rezultati kolokvija,termini usmenih ili pismenih ispita, obavijesti o odga�anju nastave ili pomicanju terminaodrºavanja predavanja. Kako bi im olak²ali muke oko pra¢enja promjena s vlastitog ra£unala,napraviti ¢emo aplikaciju koja ¢e to raditi umjesto njih.

Aplikacija ¢e biti koncipirana tako da kad se pokrene, korisniku ponudi na izbor kolegijekoje moºe pratiti, a nakon korisnikovog odabira i izlaska iz gra�£kog su£elja, potprogramkoji radi u pozadini ¢e preuzeti podatke o kolegijima Odjela za matematiku koje mora pratitite svakih 10 sekundi provjeriti web stranice odabranih kolegija. Ako primjeti da je do²lo dopromjene, kreirati ¢e jedan dijalo²ki okvir upozorenja koji ¢e korisniku prikazati da je do²lodo promjene na odre�enom kolegiju.

Pogledajmo nekoliko screenshotova kako gotova aplikacija izgleda:

Slika 15. Prikaz izbora kolegija

21

Slika 16. Obavijest nakon ²to odaberemo kolegije

Slika 17. Dijalo²ki okvir koji se pojavljuje ukoliko do�e do promjene

Progamerski dio ove aplikacije sastoji se od dva programa. Prvi program je zaduºenza kreiranje gra�£kog su£elja koje korisniku nudi na izbor kolegije, dok je drugi programpozadinski. Pozadinski zna£i da ¢e se u njemu odvijati beskona£na petlja koja ¢e redomprovjeravati web stranice stranice, te to ne¢e biti vidljivo korisniku. Korisnik ¢e eventualnomo¢i vidjeti dijalo²ki prozor da je do²lo do promjene, ukoliko pozadinski program uo£i da jeodre�ena stranica aºurirana.

22

Krenimo prvo od detaljnije analize prvog programa kojeg ¢emo nazvati konzola. Oddodatnih biblioteka moramo uvesti wx zbog gra�£kog su£elja. Zatim ¢emo de�nirati tri nizau kojoj ¢e jedan sadrºavati nazive svih ponu�enih kolegija, drugi istim redoslijedom url-ovekolegija na kojima se postavljaju obavijesti, a tre¢i niz ostavljamo prazan. Pogledajmo kakoto izgleda:

Slika 18. Po£etak programskog dijela konzole

Nakon de�niranja nizova kre¢emo s izgradnjom framea, na kojem ¢e biti postavljen panel,dva gumba, i checkboxovi s nazivima kolegija. Checkbox je objekt unutar framea koji izgledakao mala ku¢ica. Unutar te ku¢ice moºemo staviti kva£icu ili ju ostaviti praznu. Intuitivnomoºemo zaklju£iti da ¢e checkbox objekt, u ovisnosti o tome ima li kva£ice unutar ku¢ice,poprimiti boolean vrijednost: 0 ako nema kva£ice, a 1 ako je ku¢ica ozna£ena. Checkboxizgra�ujemo pomo¢u konstruktora wxCheckBox kojemu zadajemo slijede¢e parametre: par-ent, id, title (de�nirali smo njihova zna£enja u poglavlju o prozoru najvi²e razine). Izme�uostalog pozvati ¢emo i wxSizer klasu. Njena konstrukcija je dosta sloºena, ali dovoljno ¢e bitiobjasniti njenu ulogu. wxSizer klasa je zaduºena kako bi sve potprozore Framea �drºala� nasvom mjestu. Ona se brine za pravilan razmak izme�u svih potprozora i objekata kako ne bido²lo do eventualnog gra�£kog �preklapanja� checkboxova i gumbova koji se nalaºe na na²emframeu. Ona ne odre�uje to£nu poziciju potprozora na frameu, ve¢ frame dijeli u zadanomomjeru kako bi, ukoliko korisnik pro²iri po£etnu veli£inu framea, mogla �pomaknuti� tipkerazmjerno pro²irenju framea, paze¢i da je sve estetski posloºeno. I naravno, za kraj po-mo¢u EVT_BUTTON iz metode bind, pridruºiti ¢emo funkcionalnost gumbovima, koju ¢emo unastavku programa to£nije de�nirati. Pogledajmo sada implementaciju navedenih stvari uPythonu:

23

Slika 19. Kreiranje gra�£kog su£elja konzole

Zatim de�niramo novu tekstualnu datoteku na ra£unalu i nedovr²enu poruku obavi-jesti koja ¢e se prikazati korisniku kada odabere kolegije, pa nam preostaje samo de�niratifunkcionalnost gumbova. Ideja je slijede¢a: na pritisak tipke �Promijeni� redom ¢emo ispitativrijednosti svih checkboxova i njihove vrijednosti spremati u praznu listu koju smo de�niralina po£etku programa. Prilikom ispitivanja vrijednosti checkboxova, ukoliko je ona jednaka1, nadopuniti ¢emo poruku obavijesti korisniku s nazivom kolegija koji je pod tim check-boxom. Drugom gumbu �Zatvori� odre�ujemo funkcionalnost zatvaranja na²eg po£etnogframea. Nakon toga, konstruirati ¢emo dijalo²ki okvir koji ¢e korisniku ispisati na zaslonporuku obavijesti s kolegijima koje ¢e program pratiti za njega. I poslijednji korak prijedovr²etka gra�£kog dijela i pokretanje glavne petlje je spremiti sve vrijednosti u novode�ni-ranu tekstualnu datoteku pod nazivom �list.txt�. I prvi program je gotov. Kod kreiranjapozadinskog programa koji slijedi pojasniti ¢emo spremanje ovih boolean vrijednosti check-boxova u tekstualnu datoteku na ra£unalu. Pogledajmo sada kod:

24

Slika 20. Dodavanje funkcionalnosti gumbovima konzole

Drugi program implementiramo na na£in da ¢emo u njemu morati u£itati niz koji smoprethodnim programom spremili u tekstualnu datoteku �list.txt�. Taj niz sadrºi boolean vri-jednosti checkboxova pro²log programa, odnosno korisnikov odabir kolegija. Kada u£itamotaj niz, na² program ¢e prema vrijednostima checkboxa znati koje to£no url-ove kolegijamora promatrati. Krenimo sada redom, detaljnije opisati ²to ¢e program raditi. Prvo de�ni-ramo 2 niza identi£na kao u prvom programu, zna£i popis kolegija i popis url-ova istih.Zatim program provjerava postoji li u ishodi²nom folderu tekstualna datoteka �date.txt� ukojoj bi trebali biti spremljeni podaci kada je do²lo do zadnje promijene svakog ponu�enogkolegija. Ukoliko postoji, program se nastavlja, a ukoliko ne postoji program kreira tek-stualnu datoteku i u nju zapisuje niz podataka o zadnjem aºuriranju stranica kolegija. Tepodatke pribavlja pomo¢u de�niranog otvara£a url-ova, to£nije iz rje£nika objekta zaglavljapotraºuje atribut last-modified, kako ne bi morao potraºivati cijeli HTML dokument, ve¢samo podatak o zadnjem aºuriranju. Zatim se pokre¢e beskona£na petlja u kojoj programu£itava niz iz datoteke �list.txt�. Ako je vrijednost £lana niza jednaka 0, ide na slijede¢uiteraciju, a ako je jednaka 1 onda odmah provjerava pomo¢u otvara£a url-a kada se zad-nji put taj kolegij aºurirao i uspore�uje rezultat s podatkom iz datoteke �date.txt�. akose podaci podudaraju, iterativni postupak se nastavlja bez promijene. A ako se ne podu-daraju, podiºe se dijalo²ki okvir na kojem se ispisuje obavijest da je do²lo do promjene nastranici odre�enog kolegija, te se pripadni podatak iz datoteke �date.txt� zamjenjuje novimpodatkom o zadnjem aºuriranju web stranice. Nakon zatvaranja dijalo²kog okvira, programse vra¢a svojoj beskona£noj petlji i daljnjem provjeravanju aºuriranja stranica. Napomena:u beskona£noj petlji je umetnuta odgoda od 10 sekundi korite¢i biblioteku time, kako pro-gram ne bi imao stalne zahtjeve prema serveru za provjerom aºuriranja stranice, ve¢ samou odre�enim vremenskim intervalima. Primjer koda drugog programa moºemo pogledati naslijede¢oj slici:

25

Slika 21. Pozadinski program

Time je na²a aplikacija u potpunosti zavr²ena. Kada jednom pokrenemo pozadinskiprogram on ¢e raditi bez prekida i tako nam osigurati konstantan nadzor nad odabranimweb stranicama.

26

6 Zaklju£ak

Svaki kvalitetan program nuºno zahtjeva i kvalitetno gra�£ko su£elje, jer upravo je gra�kaprva stvar s kojom ¢e se korisnik pri pokretanju programa susresti. Vaºnost prvog dojma,kao i estetike nije potrebno posebno isticati, pa je zbog toga bitno da svaki programer uloºitruda u izgradnju korisni£kog gra�£kog su£elja.

U ovom radu sam pribliºio osnove izgradnje gra�£kog su£elja koriste¢i wxPython i pravilnogde�niranja temeljnih dijelova gra�ke. Pouzdan i £vrst temelj nezaobilazni su koraci ako ºe-limo kod korisnika vidjeti pozitivan dojam pri susretu s na²om aplikacijom ili ukoliko na²uaplikaciju mislimo s vremenom nadogra�ivati. �ist, lijep i razumljiv kod je ono £emu tre-bamo teºiti.

Na primjeru vlastite aplikacije poku²ao sam predo£iti kako uz osnovno poznavanje HTTPprotokola i izgradnje gra�£kog su£elja moºemo kreirati mali, oku ugodan i logi£an program,koji ima izuzetnu funkcionalnost kod dana²njih studenata. Nadam se da ¢e vas taj primjerpotaknuti na vlastito razmi²ljanje koje ¢e rezultirati izradom va²eg programa s kvalitetnimgra�£kim su£eljem i jo² ve¢om funkcionalno²¢u koju krajnji korisnik treba.

Zahvalu up¢ujem mentoru doc.dr.sc.Domagoju Matijevi¢u zbog sve pomo¢i prilikomstvaranja ovog zavr²nog rada, a posebno u izradi prakti£nog dijela.

27

7 Literatura

[1] B. Rhodes, J.Goerzen, Foundations of Python Network Programming: The comprehen-sive guide to building network applications with Python, second edition, Apress, SAD,2010.

[2] Hypertext Transfer Protocol. U Wikipediji. Dostupno na:http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol

[3] HTTP/1.1 Conditional Requestshttp://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-16

[4] Mario Essert: Python osnove, Odjel za matematiku Sveu£ili²ta Josipa Jurja Strossmay-era, Osijek, 2007.

[5] N. Rappin, R. Dunn: wx.Python in Action, Manning, Greenwich, UK, 2006.

[6] Python programming language. U Wikipediji. Dostupno na:http://en.wikipedia.org/wiki/Python_(programming_language)

[7] wxPython Historyhttp://wiki.wxpython.org/WxPythonHistory

28

8 Prilog - popis slika

Slika 1. Primjer programa u Pythonu........................................................................................4Slika 2. Funkcioniranje aplikacijskog objekta i objekta prozora najvi²e razine............................7Slika 3. Kreiranje podklaze od wx.App......................................................................................8Slika 4. Redoslijed izvr²avanja u Pythonu..................................................................................8Slika 5. Konstruiranje okvira.....................................................................................................9Slika 6. Jednostan primjer kreiranja i popunjavanja framea......................................................10Slika 7. Jednostan primjer kreiranja i popunjavanja framea (kôd).............................................11Slika 8. YES/NO dijalo²ki okvir...............................................................................................12Slika 9. Kod za kreiranje dijalo²kog okvira................................................................................12Slika 10. Novi �otvara£� URL-a.................................................................................................17Slika 11. Pozivanje novode�niranog �otvara£a�..........................................................................18Slika 12. Ilustracija pozivanja GETmetode..............................................................................18Slika 13. Primjer preusmjeravanja............................................................................................20Slika 14. Postojanost veze.........................................................................................................20Slika 15. Prikaz izbora kolegija..................................................................................................21Slika 16. Obavijest nakon ²to odaberemo kolegije......................................................................22Slika 17. Dijalo²ki okvir koji se pojavljuje ukoliko do�e do promjene.........................................22Slika 18. Po£etak programskog dijela konzole............................................................................23Slika 19. Kreiranje gra�£kog su£elja konzole..............................................................................24Slika 20. Dodavanje funkcionalnosti gumbovima konzole...........................................................25Slika 21. Pozadinski program....................................................................................................26

29