Python


GUI - Grafični uporabniški vmesniki - osnove

Sedaj se bomo lotili razvoja grafičnega uporabniškega vmesnika, takega z gumbi, drsniki in menuji.

Najprej pa moramo narediti prostor, kamor bomo hranili naše programe v Pythonu. Naredi torej nov direktorij in mu morda daj ime  "PYTHON".

Sestavi naslednji preprost program:

    from Tkinter import *   # za sestavljanje GUI (iz Tk toolkit)

okno = Tk() # Glavno okno programa(to je takoimenovani widget)

oznaka = Label(okno, text="Pozdravljen svet!") # widget "Label", otrok widgeta okno
oznaka.pack() # tako zahtevamo prikaz widgeta

okno.mainloop() # sprozimo tek programa.

Shrani ta program v datoteko  "pozdrav.py"  in ga poženi. Polek klasičnega konzolnega okna (v katerem običajno vidiš izpise stavkov "print" in druga obvestila) bi se ti moralo prikazati še  majhno okno, kot ka kaže spodnja slika:


Datoteko "pozdrav.py" preimenuj v "pozdrav.pyw" ,kar pomeni, da je to program tipa "Python for Windows". Če ga poženeš, ne bo več (sedaj odvečnega in grdega) konzolnega okna temveč le grafično. 

Najprej povejmo kaj o pojmu "widget". "Widgeti" so komponente grafičnih uporabniških vmesnikov. Gumbi so "widgeti". Oznake (labels) so "widgeti". Vsako okno je widget. Widgete  delamo s primernimi orodji (toolkit), v svetu Python uporabljamo kot orodje takoimenovani Tk. V Pythonu obstaja modul za povezavo s Tk, imenuje pa se Tkinter. Zato smo najprej v prvi vrstici uvozili widgete iz modula Tkinter.

Vsak widget je v modulu Tkinter  predstavljen z ustreznim razredom. Tvorimo ga zato kakor druge objekte. Prvi widget, ki smo ga naredili, je osnovno okno programa. Naredimo ga tako:

    okno = Tk()

Tako osnovno okno (root window) potrebuje vsak grafični uporabniški vmesnik.

V našem primeru smo vanj hoteli zapisati obvestilo "Pozdravljen svet!". V ta namen smo uporabili widget "Label", po naše tekstovno oznako:

oznaka = Label(okno, text="Pozdravljen svet!")

Prvi argument konstruktorja je ime "očeta" tega widgeta. Povedati moramo namreč, kam umestiti widget. To pa storimo tako, da povemo, kdo je "oče" tega widgeta. V našem primeru smo hoteli oznako umestiti v glavno okno.

Naslednji argument konstruktorja vsebuje besedilo, ki ga želimo prikazati. Istočasno uvaja nov način klicanja funkcij:  

Namesto, da posredujemo argumente po položaju, omogoča Python posredovanje argumentov po imenu. Sledita konkretna primera obeh načinov:

    def deljenje(stevec,imenovalec):
return stevec/imenovalec

rezultat = deljenje(10,2)
istiRezultat = deljenje(stevec=10,imenovalec=2)

Python tudi omogoča definiranje privzetih (default) vrednosti za argumente. Zato lahko kličemo funkcije, ne da bi definirali vse parametre. Tako kot na primer:

    def stevilkaTelefona(drzava="+386",mesto,stevilka):
return "(" + drzava + ") " + mesto + stevilka

print stevilkaTelefona(mesto="01", stevilka="5556666")
print stevilkaTelefona(drzava="+39", mesto="040", stevilka="2223333")

V Tk  je ogromno stvari, ki jih lahko določimo pri vsakem widgetu (velikost, barva položaj, smer,  besedilo , povratne funkcije (callbacks), itd) in za večino nas niti ne zanimajo njihove vrednosti. Uporabljamo kar privzete (default) vrednosti. Tako so gumbi, okna in druge komponente pogosto kar sive barve. Zato smo v našem primeru klicali konstruktor "Label ( )" le z enim imenovanim parametrom (text), saj nas zanima le to.

V začetku, ko jih naredimo, so widgeti nevidni. Zato moramo uporabiti naslednjo vrstico:

    oznaka.pack()

Metoda  "pack" pove widgetu, da naj se poveča in pojavi. Pakiranje widgeta pomeni, da skuša biti čim manjši, vendar dovolj velik, da je njegova vsebina vidna. Tako ugotovi widget "oznaka", kako velik je tekst "Pozdravljen svet!" in svojo velikost postavi temu primerno. In zatem pove še Tk-ju, da želi biti viden.

V tem hipu je "oznaka" še vedno nevidna, saj je njen oče ("okno") neviden. "okno" postane vidno šele, ko kličemo metodo "mainloop". To je funkcija, ki bo obravnavala izvajanje programa. Več o tem pa v naslednjem poglavju.