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())))
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: