180 likes | 389 Views
Python - Grafični uporabniški vmesniki. Gumbi, dogodki, …. Gumb. Button Ima lastnost command Tam vpišemo ime funkcije, ki se izvede ob kliku na gumb import tkinter def kajdelam (): print(" Klik !") okno = tkinter.Tk ()
E N D
Python - Grafični uporabniški vmesniki Gumbi, dogodki, …
Gumb • Button • Ima lastnost command • Tam vpišemo ime funkcije, ki se izvede ob kliku na gumb import tkinter def kajdelam(): print("Klik!") okno = tkinter.Tk() gumb = tkinter.Button(okno, text="OK", command=kajdelam) gumb.pack() okno.mainloop()
Dogodkovno programiranje • S tem smo dejasnko začeli uporabljati dogodkovno programiranje • Naši grafični objekti ob določenem dogodku (klik, sprememba vrednosti, …) znajo izvesti določeno akcijo, s katero lahko spet vplivajo na druge objekte, ki spet zaradi dogodka nad njimi sprožijo nove akcije …
Štejmo klike • Denimo, da bi želeli šteti, koliko je klikov • Poleg gumba imejmo še oznako, ki bo štela klike • Metoda kajDelam() • Nastavi vrednost napisa na oznaki • Poveča števec klikov • Problema • Kako povečevati • Kako spreminjati napis
Povečevanje števca def stejemo() : stej = stej + 1 stej = 0 print(stej) stejemo() print(stej)
Globalne spremenljivke def stejemo() : globalstej stej = stej + 1 stej = 0 print(stej) stejemo() print(stej)
A pozor! • Načeloma se globalnim spremenljivkam izogibamo! • Pravi način bi bil preko objektov, lastnosti … • A tega še ne znamo!
Spremeniti napis importtkinter okno = tkinter.Tk() vsebinaNapisa = tkinter.StringVar() stejem = tkinter.Label(okno, textvariable= vsebinaNapisa, font=('Arial', 30), width=10, height=5) stejem.pack() vsebinaNapisa.set("ZDRAVO!") okno.mainloop()
Program za štetje import tkinter def kajDelam(): global števec # uporabljamo globalno spremenljivko števec vsebinaNapisa.set("Klikov: " + str(števec)) števec= števec+ 1 okno = tkinter.Tk() gumb = tkinter.Button(okno, text="OK", command=kajDelam) gumb.pack() vsebinaNapisa = tkinter.StringVar() vsebinaNapisa.set("Klikov: 0") štejem= tkinter.Label(okno, textvariable = vsebinaNapisa, font =('Arial', 30), width=10, height=5) štejem.pack() števec= 0 okno.mainloop()
Zagon programa • Kako bi sestavili uporabniški vmesnik, ki bi omogočal izbiro med različnimi programi? • Ob kliku na ustrezen gumb, bi se zagnal nek program, ki bi potem svoje odgovore izpisal v samostojnem oknu.
Samostojno okno • Prikaz samostojnega okna le z rezultati: • tkinter.messagebox.showInfo('Ime okna', 'Vsebina') • Zgled import tkinter kajNajIzpišem= input("Kajnajizpišem: ") tkinter.messagebox.showinfo("ŽELELI STE in ...", kajNajIzpišem)
Koda import tkinter # uporabniškivmesnik def GUI() : okno = tkinter.Tk() #imamo tri programe, torej tri gumbe gumb1 = tkinter.Button(okno, text = 'Obrni', command = obrniNiz) gumb1.pack() gumb2 = tkinter.Button(okno, text = 'Razbij', command = razbij) gumb2.pack() gumb3 = tkinter.Button(okno, text = 'Seštevaj', command = seštevaj) gumb3.pack() # in poženimo vse skupaj okno.mainloop()
Koda # funkcije def obrniNiz() : ''' preberemoniz in gaizpišemo v oknu ''' niz = input("Vnesiniz: ") obNiz = niz[::-1] # obračamo niz tkinter.messagebox.showinfo('Obrnjeniniz',niz+ '\n\nobrnjen\n\n' + obNiz) def razbij() : pass def seštevaj() : pass Povemo, da ni tukaj še nič, le "okostje" Uporabno za testiranje
Vnos podatkov • Ali je možno narediti vnos podatkov preko GUV • Vnosno polje • Entry • Osnovna lastnost: • Širina (width) • Osnovna metoda • Vsebina vnosa • get()
Šparta import tkinter # uporabniškivmesnik def GUI() : okno = tkinter.Tk() vnos = tkinter.Entry(okno, width = 10) vnos.pack() gumb2 = tkinter.Button(okno, text = 'Prikaživnos', command = prikaz) gumb2.pack() okno.mainloop() def prikaz() : kajJe = vnos.get() print(kajJe)
A te že znamo rešiti • Res? • global vnos • v prikaz() • A ne pomaga … • Poskusimo >>> GUI() Exception in Tkinter callback Traceback (most recent call last): File "C:\Python30\lib\tkinter\__init__.py", line 1399, in __call__ return self.func(*args) File "C:/Users/lokar/Desktop/PythonGrafika/vnos.py", line 17, in prikaz kajJe = vnos.get() NameError: global name 'vnos' is not defined >>> • Razen če … • Seveda, vnos je lokalna spremenljivka v GUI • Zato global vnos znotraj GUI() in ne v prikaz()!
Pregled gr. objektov in njihovih lastnosti • Denimo: • http://effbot.org/tkinterbook/tkinter-index.htm#class-reference • http://www.pythonware.com/library/tkinter/introduction/tkinter-reference.htm • http://infohost.nmt.edu/tcc/help/pubs/tkinter/index.html • In sedaj je ovira le še vaša domišljija in vaši programi bodo zasijali v vsej svoji lepoti ;-) • No, dejstvo je, da če želimo delati malo lažje (in brez čaranja z globalnimi spremenljivkami in podobnim), potrebujemo objekte in objektni pristop