4.OSNOVE KORISNIČKOG INTERFEJSA

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

 

4.1. Uvod

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.

 

4.2. Struktura korisničkog interfejsa Python aplikacije

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

 

Python_application_UI_skeleton

 

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
 
 
#Podesavanje naslova aplikacije
appuifw.app.title = u"MyApplication"
 
#Kreiranje instance od Text control i podešavanje tela aplikacije
appuifw.app.body = t = appuifw.Text()
 
def show_time(): t.add(unicode(time.ctime()))
 
def quit():
    app_lock.signal()
    appuifw.app.set_exit()
 
#Kreiranje menija, definisanje callback funkcija show_time and quit respektivno
appuifw.app.menu = [(u"Show time", show_time), (u"Exit", quit)]
 
#Podešavanje da se funkcija pozove kada se pritisne dsni softkey (quit)
appuifw.app.exit_key_handler = quit
 
#Kreiranje instance Ao_lock - an active object based synchronization service
app_lock = e32.Ao_lock()
 
#Wait for application lock to be signalled
app_lock.wait()

 

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

 

 

4.3. Naslov, Orijentacija i Veličina Ekrane

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

 

600px-Title_change.jpg

 

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
 
 
#Podešavanja orijentacije na 'landscape'
appuifw.app.orientation = 'landscape'
#Čekanje od 3 sekunde
e32.ao_sleep(3)
#Podešavanje orijentacije na 'portrait'
appuifw.app.orientation = 'portrait'

 

 

Slika 5 – Aplikacija u ’landscape’ orijentaciji

 

320px-PythonOnSymbian4.3_Landscape.jpg

 

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
 
 
#Set the screen to 'full'
appuifw.app.screen = 'full'
#Wait 3 seconds
e32.ao_sleep(3)
#Set the screen to 'large'
appuifw.app.screen = 'large'
#Wait 3 seconds
e32.ao_sleep(3)
#Set the screen to 'normal'
appuifw.app.screen = 'normal'

 

 

Slika 6 – Primer aplikacije u tri veličine tela

 

PythonOnSymbian4    PythonOnSymbian4    PythonOnSymbian4

             'full'                                  'large'                                     'normal'  

 

 

4.4. Obaveštenja (Notifications)

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
 
appuifw.note(u"Process complete", 'conf')
appuifw.note(u"Low memory", 'info')
appuifw.note(u"Operation aborted!", 'error')

 

Sledeća slika prikazuju rezultate (Slika 7):

 

 

Slika 7 – Prikaz tipova obaveštenja ’appuifw’ modula

 

180px-PythonOnSymbian4.5_Note_conf.jpg     180px-PythonOnSymbian4.5_Note_info.jpg     180px-PythonOnSymbian4.5_Note_error.jpg

                '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
 
 
globalui.global_note(u"Item available", 'info')
globalui.global_note(u"An error has occured!", 'error')
globalui.global_note(u"Message", 'text')
globalui.global_note(u"Warning!", 'warn')
globalui.global_note(u"Operation in progress", 'wait')
globalui.global_note(u"Permanent note", 'perm')
globalui.global_note(u"Operation complete", 'confirm')
globalui.global_note(u"", 'charging')
globalui.global_note(u"", 'not_charging')
globalui.global_note(u"", 'battery_full')
globalui.global_note(u"", 'battery_low')
globalui.global_note(u"", 'recharge_battery')

 

 

Slika 8 – Prikaz tipova obaveštenja ’globalui’ modula

 

180px-PythonOnSymbian4.6_Gnote_info.jpg   180px-PythonOnSymbian4.6_Gnote_error.jpg   179px-PythonOnSymbian4.6_Gnote_text.jpg   180px-PythonOnSymbian4.6_Gnote_warn.jpg

         ‘info’                         ‘error’                        ‘text’                          ‘warn’

 

 

180px-PythonOnSymbian4.6_Gnote_wait.jpg   179px-PythonOnSymbian4.6_Gnote_perm.jpg   180px-PythonOnSymbian4.6_Gnote_conf.jpg   180px-PythonOnSymbian4.6_Gnote_charging.jpg

          ‘wait’                        ‘perm’                       ‘conf’                    ‘charging’

 

179px-PythonOnSymbian4.6_Gnote_not_charging.jpg   180px-PythonOnSymbian4.6_Gnote_battery_full.jpg   180px-PythonOnSymbian4.6_Gnote_battery_low.jpg   180px-PythonOnSymbian4.6_Gnote_recharge_battery.jpg

      ‘not_charging’             ‘battery_full’             ‘battery_low’          ‘recharge_battery’

 

4.5. Upiti (Queries)

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
  
word = appuifw.query(u"Enter a word", 'text')
time = appuifw.query(u"Enter desired time", 'time')
date = appuifw.query(u"Enter a date", 'date')
number = appuifw.query(u"Enter a number", 'number')
decimal_number = appuifw.query(u"Enter a decimal number", 'float')
password = appuifw.query(u"Type in a password", 'code')
answer = appuifw.query(u"Are you sure?", 'query')
first_name, last_name = appuifw.multi_query(u"Enter first name", u"Enter last name")

 

Ova slika prikazuje kako izgleda svaki od navedenih upita (Slika 9):

 

 

Slika 9 – Prikaz različitih tipova upita ’appuifw’ modula

 

180px-PythonOnSymbian4.7_Query_text.jpg   180px-PythonOnSymbian4.7_Query_time.jpg   180px-PythonOnSymbian4.7_Query_date.jpg   180px-PythonOnSymbian4.7_Query_number.jpg

          ‘text’                        ‘time’                       ‘date’                      ‘number’

 

180px-PythonOnSymbian4.7_Query_float.jpg   180px-PythonOnSymbian4.7_Query_code.jpg   180px-PythonOnSymbian4.7_Query_query.jpg   179px-PythonOnSymbian4.7_Multi_query.jpg

          ‘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
 
 
globalui.global_query(u"Are you sure?")
globalui.global_msg_query(u"File transfer will begin in 5 seconds", u"Confirm operation", 5)

 

 

Slika 10 - Prikaz tipova upita ’globalui’ modula

 

                    180px-PythonOnSymbian4.8_Gquery.jpg                180px-PythonOnSymbian4.8_Gmsgquery.jpg

                               'global_query'                             'global_msg_query'

 

4.6. Meni

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
 
 
#Create an instance of Ao_lock - an active object based synchronization service
app_lock = e32.Ao_lock()
 
#Define a function that stops the script execution; it will be called when "Exit" is selected from the menu
def quit(): app_lock.signal()
 
def show_time(): print time.ctime()
 
appuifw.app.menu = [(u"Show time", show_time), (u"Exit", quit)]
 
#Do not stop the script execution until "Exit" is selected
app_lock.wait()

 

Meni sa podmenijima:

 

import appuifw, e32
 
 
app_lock = e32.Ao_lock()
 
def quit(): app_lock.signal()
 
def hello(): print "Hello"
 
def goodbye(): print "Goodbye"
 
appuifw.app.menu = [(u"Message", ((u'Say "Hello"', hello), (u'Say "Goodbye"', goodbye))), (u"Exit", quit)]
 
app_lock.wait()

 

Sledeća slika prikazuje ove dve vrste menija (Slika 11):

 

 

Slika 11 – Vrste menija

 

               180px-PythonOnSymbian4.9_Menu.jpg                  180px-PythonOnSymbian4.9_Menu_with_submenu.jpg

                      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
 
 
colours = [u"Red", u"Green", u"Blue"]
 
colour = appuifw.popup_menu(colours, u"Pick a colour")

 

 

Slika 12 – Popup meni ’appuifw’ modula

 

                                              180px-PythonOnSymbian4.10_Popup_menu.jpg

 

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
 
 
#Make a list of Unicode strings - the menu's entries
options = [u"Omlette", u"Bacon and eggs", u"Cereal", u"Sandwich"]
 
#Show the menu for 5 seconds and display what was selected
choice = globalui.global_popup_menu(options, u"Breakfast options:", 5)
print options[choice] + " was selected."

 

 

Slika 13 – Popup meni ’globalui’ modula

 

                                              180px-PythonOnSymbian4.11_Gpopupmenu.jpg

 

 

4.7. Selekcione liste (Selection lists)

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
 
 
entries = [u"Carrots", u"Potatoes", u"Onions", u"Tomatoes"]
 
selected = appuifw.multi_selection_list(entries, style="checkbox", search_field=1)
 
for i in selected:
    print entries[i] + " was selected"

 

 

Slika 14 – Multi-selekciona lista

 

                                         180px-PythonOnSymbian4.12_Multi_selection_list.jpg

 

4.8. Listbox

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
from key_codes import *
 
 
app_lock = e32.Ao_lock()
#Define the exit function
def quit():
app_lock.signal()
appuifw.app.exit_key_handler = quit
 
#The list of entries
items = [u"1", u"2", u"3", u"4"]
 
#Define the function for the arrow keys
def move(direction):
    if direction == 'right':
        if lb.current() == len(items) - 1:
               lb.set_list(items, 0)
        else:
               lb.set_list(items, lb.current() + 1)
    elif direction == 'left':
        if lb.current() == 0:
               lb.set_list(items, len(items) - 1)
        else:
               lb.set_list(items, lb.current() - 1)
 
#Create an instance of Listbox and set it as the application's body
lb = appuifw.Listbox(items, lambda:None)
appuifw.app.body = lb
 
#Bind the keys
lb.bind(EKeyRightArrow, lambda:move('right'))
lb.bind(EKeyLeftArrow, lambda:move('left'))
 
app_lock.wait()

 

Sada možemo videti kako izgleda kompleksniji Listbox – jedan sa dva reda za svaku stavku i ikonom(Slika 15).

 

import appuifw, e32
 
 
app_lock = e32.Ao_lock()
#Define the exit function
def quit():
    app_lock.signal()
appuifw.app.exit_key_handler = quit
 
#Define the icons to be used
file_icon = appuifw.Icon(u"Z:\\resource\\apps\\avkon2.mif", 17504, 17505)
folder_icon = appuifw.Icon(u"Z:\\resource\\apps\\avkon2.mif", 17506, 17507)
 
#Create a list of items to be displayed
#An item consists of two fields (Unicode strings) and an icon
items = [(u"File", u"Unknown type", file_icon), (u"Folder", u"Empty", folder_icon)]
 
#Define a function that is called when an item is selected
def handle_selection():
    appuifw.note(items[lb.current()][0] + u" has been selected.", 'info')
 
#Create an instance of Listbox and set it as the application's body
lb = appuifw.Listbox(items, handle_selection)
appuifw.app.body = lb
 
app_lock.wait()

 

 

Slika 15 – Prikaz Listbox-a

 

                   179px-PythonOnSymbian4.13_Listbox_simple.jpg               179px-PythonOnSymbian4.13_Listbox.jpg

                     Jednostavni Listbox                                    Listbox

 

4.9. Obrasci (Forms)

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
 
 
#A list of objects, such as books
titles = [u"Quick Recipes on Symbian OS", u"Java ME on Symbian OS", u"S60 Programming - A Tutorial Guide"]
 
#Create the fields to be displayed in the form
fields = [(u"Domain", 'text', u"Progamming"),
          (u"Title", 'combo', (titles, 0)),
          (u"Amount",'number', 1),
          (u"Date", 'date', time.time()),
          (u"Time", 'time')]
 
#Initialize a boolean variable to know whether the form is saved
saved = False
 
#Define a function to be called when the form is saved
def save(arg):
    global saved
    saved = True
    return True
 
#Create a Form object
myForm = appuifw.Form(fields, flags=appuifw.FFormEditModeOnly)
 
#Assign the save function
myForm.save_hook = save
 
#Execute the form
myForm.execute()
 
#After the form is saved and closed, display the information
if saved == True:
    print myForm[0][2]
    print titles[myForm[1][2][1]]
    print myForm[2][2]
    print time.strftime("%d/%m/%Y", time.localtime(myForm[3][2]))
    print time.strftime(time.ctime(myForm[4][2])[11:20])

 

 

Slika 16 – Prikaz obrasca

 

                                          180px-PythonOnSymbian_4.14_Form.jpg

 

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:

 

 

4.10. Tekst editor (Text editor)

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
 
 
app_lock = e32.Ao_lock()
 
def quit():
  app_lock.signal()
appuifw.app.exit_key_handler = quit
 
#Create an instance of Text and set it as the application's body
appuifw.app.body = t = appuifw.Text()
 
#Set the color of the text
t.color = 0xEE00DD
 
#Set the color for the highlight of the text
t.highlight_color = 0xFFFF00
 
#Set the font by name, size and flags
t.font = (u"Nokia Hindi S60", 25, None)
 
#Highlight the text and set the style of the text to bold and strikethrough
t.style = (appuifw.HIGHLIGHT_STANDARD | appuifw.STYLE_BOLD | appuifw.STYLE_STRIKETHROUGH)
 
#Write text to see the effect
t.add(u"Your text here")
 
app_lock.wait()

 

Pogledajmo kako ovo izgleda na sledećoj slici (Slika 17):

 

 

Slika 17 – Prikaz primera tekst editora

 

                                           180px-PythonOnSymbian4.15_Text.jpg

 

 

4.11. Kartice (Jezičci, Tabs)

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
 
 
app_lock = e32.Ao_lock()
 
def quit():
  appuifw.app.set_tabs([], None)
  app_lock.signal()
appuifw.app.exit_key_handler = quit
 
#Define the tabs
tab1 = appuifw.Text(u"This is tab #1")
tab2 = appuifw.Text(u"This is tab #2")
 
#Create a function that handles switching between tabs
def tab_handler(index):
    #Switch to the tab according to index
    if(index==0):
        appuifw.app.body = tab1
    if(index==1):
        appuifw.app.body = tab2
 
#Set the tabs
appuifw.app.set_tabs([u"One", u"Two"], tab_handler)
 
#Open the first tab
appuifw.app.body = tab1
 
#Wait for the user to request the exit
app_lock.wait()

 

Ovako izgleda naš primer (Slika 18):

 

 

Slika 18 – Interfejst sa jezičcima (tab-ovima)

 

                                             180px-PythonOnSymbian4.16_Tabs.jpg

 

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.

 

 

4.12. InfoPopup

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
 
 
#Create an instance of InfoPopup
popup = appuifw.InfoPopup()
 
#Show the popup for 7 seconds at coordinates (150, 160)
popup.show(u"Message", (150, 160), 7000)

 

Evo kako izgleda naš primer(Slika 19):

 

 

Slika 19 - InfoPopup

 

                                          180px-PythonOnSymbian4.17_InfoPopup.jpg

 

4.13.TopWindow

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
 
 
app_lock = e32.Ao_lock()
#Define the exit function
def quit():
    app_lock.signal()
appuifw.app.exit_key_handler = quit
 
#Instantiate a TopWindow
window = topwindow.TopWindow()
 
#Define its size and the coordinates of its top left corner
window.size = (210, 160)
window.position = (10, 40)
 
#Create a new, blank image and colour it, then write a message on it
img = graphics.Image.new((195, 110))
img.clear(0xFF0000)
img.text((25, 25), u"This is a topwindow example", font = 'title')
 
#Place the image on the TopWindow object and define some of the objects visual characteristics
window.add_image(img, (10, 10))
window.background_color = 0x00FF00
window.shadow = 4
window.corner_type = 'corner5'
 
#Display the TopWindow
window.show()
 
app_lock.wait()

 

Naš primer izgleda ovako (Slika 20):

 

 

Slika 20 – TopWindow

 

                                          180px-PythonOnSymbian4.18_TopWindow.jpg

 

 

 

PyS60