GUI 2 - Nauk.si

Download Report

Transcript GUI 2 - Nauk.si

Python - Grafični uporabniški
vmesniki
Gumbi, dogodki, …
1
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()
2
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 …
3
Š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
4
Povečevanje števca
def stejemo() :
stej = stej + 1
stej = 0
print(stej)
stejemo()
print(stej)
5
Globalne spremenljivke
def stejemo() :
global stej
stej = stej + 1
stej = 0
print(stej)
stejemo()
print(stej)
6
A pozor!
Načeloma se globalnim spremenljivkam
izogibamo!
Pravi način bi bil preko objektov, lastnosti …
A tega še ne znamo!
7
Spremeniti napis
import tkinter
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()
8
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()
9
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.
10
Samostojno okno
Prikaz samostojnega okna le z rezultati:
tkinter.messagebox.showInfo('Ime okna',
'Vsebina')
Zgled
import tkinter
kajNajIzpišem = input("Kaj naj izpišem: ")
tkinter.messagebox.showinfo("ŽELELI STE in
...", kajNajIzpišem)
11
Koda
import tkinter
# uporabniški vmesnik
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()
12
Koda
# funkcije
def obrniNiz() :
''' preberemo niz in ga izpišemo v oknu '''
niz = input("Vnesi niz: ")
obNiz = niz[::-1] # obračamo niz
tkinter.messagebox.showinfo('Obrnjeni niz',
niz + '\n\nobrnjen\n\n' + obNiz)
def razbij() :
pass
def seštevaj() :
pass
Povemo, da ni tukaj še
nič, le "okostje"
Uporabno za testiranje
13
Vnos podatkov
Ali je možno narediti vnos podatkov preko
GUV
Vnosno polje
Entry
Osnovna lastnost:
Širina (width)
Osnovna metoda
Vsebina vnosa
get()
14
Šparta
import tkinter
# uporabniški vmesnik
def GUI() :
okno = tkinter.Tk()
vnos = tkinter.Entry(okno, width = 10)
vnos.pack()
gumb2 = tkinter.Button(okno,
text = 'Prikaži vnos', command = prikaz)
gumb2.pack()
okno.mainloop()
def prikaz() :
kajJe = vnos.get()
print(kajJe)
15
In ponovne težave
16
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()!
17
Pregled gr. objektov in njihovih lastnosti
Denimo:
http://effbot.org/tkinterbook/tkinter-index.htm#classreference
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
18