Python
GUI - izvajanje
Čas je, da naredimo naslednji poučen programček, katerega izgled
prikazuje spodnja slika:

Program omogoča uporabniku seštevanje dveh števil. Tu
je njegova
zanimiva koda:
from Tkinter import *
def sestejVrednosti(): s.set(str(int(a.get()) + int(b.get())))
okno = Tk() okno.title("Program za sestevanje")
a = Entry(okno) a.pack()
plus = Label(okno, text="+") plus.pack()
b = Entry(okno) b.pack()
racunaj = Button(okno, text="Sestej", command=sestejVrednosti) racunaj.pack()
s=StringVar() c=Label(okno,textvariable=s) c.pack()
okno.mainloop()
|
Morda droben nasvet: Shrani to kodo v datoteko "vsota2,py" in jo
preskusi. Ko si zadovoljen (ko ni več potrebe po
popravljanju morebitnih napak) preimenuj datoteko v vsota2.pyw)
In sedaj komentar programa: začne se s stavkom "import". Za trenutek
ignorirajmo funkcijo "sestejVrednosti()", ki se ji bomo posvetili
kasneje. Tudi naslednja vrstica, ki tvori osnovno (korensko, root)
okno, nam je znana iz prejšnjega primera. Se spomniš, da
he v prejšnem
primeru kot naslov okna pisalo kar "th"? Ta napis lahko preprosto
zamenjamo z uporabo okenske metode "title":
okno.title("Program za sestevanje")
|
V našem primeru je okno premajhno, da bi ta naslov videl v
celoti. Če
pa okno raztegneš, ga vidiš.
Uvajamo nov widget z imenom "Entry".
Ta widget omogoča uporabniku vnos niza v majhen pravokotnik na
zaslonu. V našem primeru imamo dve taki komponenti:

V splošnem imamo lahko takih komponent še več, Tako kot
pri widgetu
"Label" moramo tudi tu kot prvi parameter konstruktorja navesti, kdo je
oče (oziroma vsebovalnik) te komponente. Za druge parametre
konstruktorja nam ni mar:
a = Entry(okno) a.pack() .......... b = Entry(okno) b.pack()
|
Widgeta "label" nam ni potrebno pojasnjevati. Iz slike pa je
razvidno, da vrstni red tvorbe teh komponent vpliva na to, kako so
razporejene v našem oknu,
Sledi widget "Button" (po
naše gumb). Gumbi so čudovita stvar, saj dajejo uporabniku
občutek
moči: nanje lahko klikneš in nato se kaj zgodi.
racunaj = Button(okno, text="Sestej", command=sestejVrednosti) racunaj.pack()
|
Kot običajno, je pove parameter konstruktorja, kdo je oče (oziroma
vsebovalnik) komponente. Sledita pa še dva parametra, ki
povesta,
kakšen tekst naj piše na gumbu in kakšna akcija
(command) naj se izvede
ob kliku na gumb. V parametru "command" zato navedemo kot
argument ime funkcije. Spomnimo se, da smo pojasnili prav te funkcije
začasno preskočili.
Opazimo še, da sami funkcije "sestejVrednosti" nikdar ne
kličemo!
Za to skrbi kar sam program oziroma to je tisto, kar se dogaja v metodi
"mainloop".Grafične uporabniške vmesnike tipično programiramo
tako, da
sami direktno ne kličemo funkcij, pač pa uporabnik nekaj naredi (klik
na gumb, vnos podatkov, premik miške ipd), modul "Tk" pa namesto
nas
poskrbi za klic ustrezne funkcije.
Naslednja oznaka (Label) v našem programu je nekaj
posebnega. Tu
naj bi namreč prišlo do izpisa rezultata seštevanja:
s=StringVar() c=Label(okno,textvariable=s) c.pack()
|
Zato, namesto da določimo statičen tekst, tvorimo spremenljivko, ki
je objekt iz razreda "StringVar". oznako (v našem primeru
"c")
tvorimo s to spremenljivko kot "textvariable". Če se kasneje vsebina
"textvariable" spremeni, se spremeni tekst oznake. To vsebino pa
spreminja funkcija "sestejVrednosti".
Oglejmo si sedaj funkcijo "sestejVrednosti". V njej
spreminjamo vrednost spremenljivke "s" (ki je objekt!!) z metodo "set". Ta metoda ima kot edini
argument novo vrednost niza. Sicer pa seštevanje v
funkciji
"sestejVrednosti" poteka tako:
def sestejVrednosti(): s.set(str(int(a.get()) + int(b.get())))
|
- Najprej vzemimo to, kar smo vtipkali v obeh vhodnih okencih
(widgetih "a" in "b"). Na teh objektih "Entry" zato uporabimo metodo "get".
- Metoda "get" objekta "Entry" vrne niz, torej tekst. Uporabiti
moramo zato vgrajeno (built-in) funkcijo "int", ki pretvori ta niz v
celoštevilčno spremenljivko (integer). Pozor: ta metoda lahko
povzroči
izjemo (exception)!! Hmm,...
- Izvedemo običajno operacijo seštevanja.
- Z vgrajeno funkcijo "str"
pretvorimo število v niz, kar potrebuje že omenjena metoda "set" razreda StringVar..
In to je to! Ta preprosti in poučni primer je dobro izhodišče za
pripravo bolj zapletenih programov. Morda si ogledaš in
preskusiš še
naslednje primere: