Ovo poglavlje objašnjava kako kreirati Python aplikaciju u izvornom (native) obliku, te kako generisati obaveštenja i upite iz non-GUI aplikacija (aplikacije bez korisničkog interfejsa).
Primeri koda:
File:PythonOnSymbianBookExampleCode ApplicationUI.zip
File:PythonOnSymbianBookExampleCode appuifw notes.zip
File:PythonOnSymbianBookExampleCode appuifw popup menu.zip
File:PythonOnSymbianBookExampleCode appuifw queries.zip
File:PythonOnSymbianBookExampleCode Double listbox.zip
File:PythonOnSymbianBookExampleCode Form.zip
File:PythonOnSymbianBookExampleCode globalui notes.zip
File:PythonOnSymbianBookExampleCode globalui popup menu.zip
File:PythonOnSymbianBookExampleCode globalui queries.zip
File:PythonOnSymbianBookExampleCode Infopopup.zip
File:PythonOnSymbianBookExampleCode Menu with submenu.zip
File:PythonOnSymbianBookExampleCode Multi selection list.zip
File:PythonOnSymbianBookExampleCode Orientation.zip
File:PythonOnSymbianBookExampleCode Screen size.zip
File:PythonOnSymbianBookExampleCode Simple menu.zip
File:PythonOnSymbianBookExampleCode Single listbox.zip
File:PythonOnSymbianBookExampleCode Tabs.zip
File:PythonOnSymbianBookExampleCode Text.zip
File:PythonOnSymbianBookExampleCode TopWindow.zip
Python obezbeđuje pristup većini UI elemenata dostupnih na Symbian platformi, dozvoljavajući brz razvoj aplikacija koje se ne razlikuju od onih napisanih u izvornom (native) kodu. Sa nekoliko linija koda, možete pisati aplikacije koje se pokreću iz menija (menu-driven apps) i uključuju tekst editore, listbox-ove, dialog-e i form-e i koje ispisuju obaveštenja i upite.
Funkcije i klase koje kreiraju korisnički interfejs aplikacije koji izgleda izvorno (apps native-looking UI) su deo appuifw (application user interface framework) modula. Ovaj modul takođe obezbeđuje funkcionalnost za kreiranje meni aplikacija i rukovanje izlaznim procesom aplikacije. Drugi modul, globalui, obezbeđuje vizualne elemente (obaveštenja i upite) za aplikacije koje nemaju UI okruženje ili se izvršavaju u pozadini.
Python aplikacije imaju istu vizualnu strukturu kao Symbian aplikacije napisane u drugim programskim jezicima. Veliki broj UI elemenata dostupnih Python-u znači da UI može biti prilagođen potrebama većine developer-a.
Sledeći prikaz predstavlja kostur Python aplikacije (Grafik 3). Pokazuje koji UI elemenat odgovara određenom području. Osim dijaloga, svaki element je deo Application instance (instanca koja je uvek prisutna kada se koristi appuifw modul i prema koja se odnosi kao prema app).
Grafik 3 – Struktura Python aplikacije
Osnovna Python aplikacija ne zahteva ikakvo određivanje po pitanju vizualne konstrukcije – postoje default implementacije za menije i naslov, pa se skripta izvršava iako navedeni nisu definisani. Aplikacija takođe ima default labelu tastera koja ne može biti promenjena: levi taster se uvek naziva „Options“ i desni se uvek nazive „Exit“.
Ozbiljnije aplikacije definišu glavne elemente korisničkog interfejsa – UI kontrolu za telo aplikacije ('telo' je glavni deo aplikacije), meni i desni softkey. Primetimo da će desni softkey, osim ako je definisano drukačije u aplikaciji, pozivati funkciju koja zatvara aplikaciju.
Predstojeći deo koda prikazuje osnovnu aplikaciju sa naslovom, tekst kontrolom za njeno telo i meni. Aplikacija prikazuje trenutno vreme u tekstualnom editoru kadgod se iz menija izabere opcija Show time. Korisnik može izaći iz aplikacije opcijom iz menija Exit ili pritiskom desnog softkey-a.
import appuifw, e32, time |
Normalna Python skripta se izvršava od početka do kraja i onda izlazi – ponašanje aplikacije je malo drugačije.
Prvo aplikacija import-uje aplikacijski framework i e32 modul, pa definiše pojedine UI elemente (koji su poprilično jasni sami po sebi, kao što je i za očekivati u Python kodu). Onda kreira instancu od Ao_lock i čeka (waits) ga. Ao_lock je aktivni planer (active scheduler) based synchronization service. Iako izvršavanje skripte staje ovde, aplikacija se još izvršava i reaguje na događaje iz menija i softkey-a.
Aplikacija nastavlja da se izvršava dok korisnik ne izabere Exit iz menija ili pomoću desnog softkey-a (oba su podešena da pozovu quit() metodu). quit() metoda signališe zaključavanje aplikacije i aktivni planer se gasi.
Samostalna aplikacija ostaje otvorena dok se ne pozove metod set_exit() aplikacijskog framework object's (until the application framework object's set_exit() method is called) . Da bi se ugasila propisno, aplikacija mora pozvati appuifw.app.set_exit() u exit callback-u (u našim primerima - quit() funkcija).
Predstojeći delovi ovog poglavlja opisuju elemente koje mogu doterati grafički interfejs aplikacije (GUI).
Naslov aplikacije se može promeniti dodelom Unicode string-a atributu ‘naslov’ instance Aplikacije. Na primer, red:
appuifw.app.title = u"MyApplication" |
podešava naslov na 'MyApplication' (Slika 4).
Slika 4 – Primer promene naslova
Python aplikacija automatski reaguju na događaje promene orijentacije (orientation change events). Ukoliko aplikacija mora da održi određenu orijentaciju, to možemo uraditi korišćenjem atributa orientation instance Application, kojem mogu biti dodeljene jedna od sledećih vrednosti: ‘automatic’ (default), ‘portrait’ ili ‘landscape’), što vidimo na sledećoj slici (Slika 5).
import appuifw, e32 |
Slika 5 – Aplikacija u ’landscape’ orijentaciji
Veličina tela aplikacije se može menjati koristeći atribut screen, koji poprima jednu od tri moguće vrednosti:
Sledeći kod i slike (Slika 6) demonstriraju tri veličine ekrana:
import appuifw, e32 |
Slika 6 – Primer aplikacije u tri veličine tela
'full' 'large' 'normal'
Beleške su popup poruke native izgleda koje aplikacija može prikazati da obavesti korisnika o raznim stvarima. Postoje tri tipa beleški: ‘conf’ (potvrda), ‘info’ (informacija) i ‘error’ (greška). Svaki tip ima drugačiju ikonu i svira prikladan zvuk.
Primer koda:
import appuifw |
Sledeća slika prikazuju rezultate (Slika 7):
Slika 7 – Prikaz tipova obaveštenja ’appuifw’ modula
'conf' 'info' 'error'
Notifikacije (obaveštenja) u modulu globalui imaju malo više varijacija, kao što možete videti u narednom kodu i slici (Slika 8):
import globalui |
Slika 8 – Prikaz tipova obaveštenja ’globalui’ modula
‘info’ ‘error’ ‘text’ ‘warn’
‘wait’ ‘perm’ ‘conf’ ‘charging’
‘not_charging’ ‘battery_full’ ‘battery_low’ ‘recharge_battery’
Upiti omogućuju aplikaciji da zahteva korisnički unos – poput lozinke ili odgovora na pitanje. Unos može biti u različitim formatima zavisno od tipa upita ('text', 'time', 'date', 'number', 'float', 'code' ili 'query').
Primer koda:
import appuifw |
Ova slika prikazuje kako izgleda svaki od navedenih upita (Slika 9):
Slika 9 – Prikaz različitih tipova upita ’appuifw’ modula
‘text’ ‘time’ ‘date’ ‘number’
‘float’ ‘code’ ‘query’ ‘multi_query’
Sada ćemo pogledati upite globalui. Postoje samo dve dostupne vrste: global_query i global_msg_query. Prvi je jednostavan upit za potvrdu, dok drugi dopušta da naznačite naslov kao dodatak tekstu. Obe vrste mogu imati timeout (zadaje se kao poslednji argument njihovim funkcijama), što znači da ukoliko korisnik ne odgovori nakon određenog broja sekundi, upit nestaje. Izgled možemo pogledati na sledećoj slici (Slika 10).
import globalui |
Slika 10 - Prikaz tipova upita ’globalui’ modula
'global_query' 'global_msg_query'
Meni aplikacije se sastoji od liste tuples-a koje sadrže labele (Unicode strings) i callbacks (funkcije koje se izvršavaju kada se odgovarajuća stavka menija odabere). Postoje dve vrste tuples-a koje se mogu koristiti:
Meni se može podesiti dodeljivanje liste tuples-a atributu menu instance Application (app).
Jednostavan meni:
import appuifw, e32, time |
Meni sa podmenijima:
import appuifw, e32 |
Sledeća slika prikazuje ove dve vrste menija (Slika 11):
Slika 11 – Vrste menija
Jednostavan meni Meni sa podmenijima
Drugi tip menija je popup meni (Slika 12). Kao što samo ime pokazuje, on se prikazuje automatski kad je pozvan. Funkcija za kreiranje je popup_menu(list[, label]). list je lista Unicode string-ova koji predstavljaju stavke menija. label je opcioni naslov koji može biti dat meniju.
import appuifw |
Slika 12 – Popup meni ’appuifw’ modula
Modul globalui pruža globalni popup meni koji može imati zaglavlje i timeout. Skoro je identičan izgledu popup menija iz appuifw, ali za razliku od njega, može biti prikazan i van Python aplikacije (Slika 13).
import globalui |
Slika 13 – Popup meni ’globalui’ modula
Selekciona lista je dialog koji prikazuje listu sa koje korisnik može izabrati unos. Može sadržati polje za pretragu (search field) koje se može koristiti za pretraživanje unosa (polje za pretragu postaje vidljivo samo onda kada korisnik počne da kuca slova poradi pretrage). Multi-selekcione liste dopuštaju odabir nekoliko unosa odjednom (Slika 14).
Za kreiranje selekcione liste, koristimo ili funkciju selection_list ili multi_selection_list sa listom Unicode string-ova kao njihovih argumenata.
import appuifw |
Slika 14 – Multi-selekciona lista
Listbox je sličan selekcionoj listi. Premda ne dopušta višestruku selekciju i nema opciju polja za pretragu, dopušta nam da definišemo koji tasteri izvršavaju akcije na listboxu (key binding) i da kontrolišemo koje će stavke biti označene, uz korišćenje ikona sa stavkama.
Konstruktor za klasu Listbox uzima listu tuples-a i callback funkciju kao svoje argumente. Callback se izvršava kada se odabir (selekcija) dogodi, i lista može imati jednu od narednih struktura.
Metod bind(event_code, callback) veže određeni kod tastera za određenu callback funkciju. U suštini, on detektuje kada se određeni taster pritisne i izvršava funkciju.
Koristeći current metod, moguće je izvući index trenutno označene stavke. Ovo takođe može biti podešeno koristeći metod set_list(list[, current], gde je list lista tuples-a kao što je opisano gore, i current je index stavke koju želimo označiti.
Kao prvi primer, kreiraćemo jednostavni Listbox i vezati tastere leve i desne strelice. Kada se pritisne taster desne strelice, sledeća stavka sa liste postaje označena, a suprotno se događa sa tasterom leve strelice(Slika 12):
import appuifw, e32 |
Sada možemo videti kako izgleda kompleksniji Listbox – jedan sa dva reda za svaku stavku i ikonom(Slika 15).
import appuifw, e32 |
Slika 15 – Prikaz Listbox-a
Jednostavni Listbox Listbox
Klasa Form nam dopušta da kreiramo prilagodljive dijaloge sa više polja (multi-field dialog). To znači da podržava nekoliko polja u isto vreme, koji mogu biti raznih tipova, read-only ili onih sa mogućnošću uređivanja.
Sledeći primer prikazuje kako kreirati i koristiti Form i kako to onda izgleda (Slika 16):
import appuifw, time |
Slika 16 – Prikaz obrasca
Pogledajmo sada pobliže šta svaki deo navedenog koda radi. Prvo, kreiramo polja koja će biti korištena u obrascu kao lista tuples-a sadržavajući labelu, tip i opciono, default vrednost za svako polje.
Nakon toga definišemo funkciju koja rukuje sa snimanjem (čuvanjem). Ova funkcija će biti pozvana svaki put kada se sadržaj izvršavajućeg Form dijaloga sačuva (snimi). Uzima listu koja predstavlja trenutni sadržaja obrasca kao argument i vraća Boolean vrednost. Ukoliko vrati True, lista se podešava kao novi sadržaj obrasca. Ukoliko se vrati False, polja obrasca se resetuje u prethodno stanje. Mi kažemo obrascu da koristi ovu funkciju save (čuvanja) koristeći atribut save_hook.
Nakon što se sačuva, jednostavno ispisujemo novi sadržaj.
Jedna činjenica jeste da se drugi argument prosleđuje konstruktoru obrasca, flags su podešeni na appuifw.FformEditModeOnly. Ovo naznačuje da obrasac treba da ostane u modu za uređivanje dok se izvršava. Drugi mogući tipovi obrazaca su:
Klasa Text obezbeđena appuifw modulom je prilagodljiv način prikazivanja teksta i prihvatanja unosa. Pruža metode za promenu teksta koji sadrži (ili sam sadržaj ili font i boju teksta) i vraća ga.
Instanca od Text može se promeniti zadavajući različite vrednosti njegovim atributima. Kompletna lista atributa sa njihovim opisima i mogućim vrednostima je dostupna u PyS60 documentation. Tamo se mogu pronaći i metoda za manipulaciju funkcionalnostima editora.
import appuifw, e32 |
Pogledajmo kako ovo izgleda na sledećoj slici (Slika 17):
Slika 17 – Prikaz primera tekst editora
Python aplikacija može koristiti kartice (jezičke) da bi omogućila korisniku lakši prelaz između interfesja. Sve što trebamo uraditi je kreirati interfejs koristeći dostupne UI kontrole i definisati funkciju koja rukuje promenom sa jednog na drugi. Kada se aplikacija zatvara, kartice se moraju ukloniti ručno. Funkcija za rukovanje karticama se poziva automatski od strane framework-a i stoga eksplicitno mapiranje tastera nije potrebno.
Primer koda:
import appuifw, e32 |
Ovako izgleda naš primer (Slika 18):
Slika 18 – Interfejst sa jezičcima (tab-ovima)
Kreirali smo dve instance Text (tab1 i tab2), po jednu sa svaku karticu, i definisali funkciju koja će se koristiti za prelaske između njih. Argument index se prosleđuje funkciji pomoću framework-a i koristi se za odlučivanje o tome koja kartica treba postati aktivna.
InfoPopup je klasa koja nam dozvoljava da prikažemo poruku na određenom mestu na ekranu koje je nedostupno standardnoj belešci, na određen broj sekundi. Izrazito je korisno kada želimo da prikažemo savete ili uputstva.
Metod show uzima tekst u obliku Unicode string-a kao svoje argumente. Opciono se mogu podesiti i drugi argumenti, poput koordinata gornjeg levog ugla okvira poruke, dužina trajanja prikaza poruke, količina vremena za čekanje pre prikazivanja poruke (u milisekundama) i poravnanje. Kompletna lista konstanti za poravnavanje i njihov opis je dostupan u PyS60 documentation.
Primer koda:
import appuifw |
Evo kako izgleda naš primer(Slika 19):
Slika 19 - InfoPopup
Klasa TopWindow (definisana u topwindow modulu) nam dopušta kreiranje prilagodljivih popup-a koji sadrže sliku ili tekst. TopWindow je jednostavno pravougaono područje koje zamrači druge elemente na ekranu i prikazuje sliku. Dimenzije mogu biti prilagođene do određene granice, dozvoljavajući nam da naznačimo da ili da ima senku ili ne, da li da uglovi budu zaobljeni i slične stvari. Može se koristiti dinamično, što znači da može biti prikazano ili skriveno u svakom trenutku i njegovo pozicioniranje se lako menja.
Primer koda:
import appuifw, e32, graphics, topwindow |
Naš primer izgleda ovako (Slika 20):
Slika 20 – TopWindow