Upload
burke
View
59
Download
0
Embed Size (px)
DESCRIPTION
Eduard Sojka URO, Léto 2003/4 VŠB – Technická univerzita Ostrava. Stručný průvodce vytvářením GUI v Python / Tk. Python / Tk: stručný průvodce. Skript. jazyk. Knih. GUI. Co děláme?. Proč?. - PowerPoint PPT Presentation
Citation preview
Stručný průvodce vytvářením GUIv Python / Tk
Eduard Sojka
URO, Léto 2003/4
VŠB – Technická univerzita Ostrava
2
Python / Tk: stručný průvodce
Skriptovací jazyky připraví nejobvyklejší použití knihoven GUI. Jste pak stručnější, rychlejší a nemusíte znát všechny detaily.
Skriptovací jazyky lépe vyhovují pro sestavování aplikací.
Co děláme?
Tvorba GUI
Tvorba s využitím skriptovacích jazyků
Tvorba s využitím obecných jazyků
Tcl/Tk
Python
J ava (Awt|Swing)
C (wxWin, Qt, …)
Proč?
Knih. GUI
Skript. jazyk
3
Python / Tk: stručný průvodce
Python je obecný programovací jazyk vhodný mimo jiné i pro skriptování a vytváření GUI.
Do jazyka Python byla nejprve vestavěna knihovna Tk (modul Tkinter).
Postupem času byly vestavěny i knihovny další. Např. wxWindows, Qt, GTK (wxPython, QtPython, GTKPython)
Použití Pythonu nemusí být ale vhodné vždy (nevhodný např. pro intenzivní matematické a technické výpočty – v těchto částech je na místě použít zejména C, C++).
Co je Python, Tkinter?
4
Python / Tk: stručný průvodce
Jazyk Python je jednoduchý. Lze se jej rychle naučit.
Datové struktury list a dictionary usnadňují sestavování aplikací a vytváření GUI. Dále bez deklarací proměnných. Proto méně kódu a rychlejší práce než v C/Java.
Python je „pěkný“ jazyk (na rozdíl od Tcl).
Existuje na všech platformách (a také dokonce i celý realizovaný v Javě – Jython).
Několik důvodů, proč byste mohli o tvorbě GUI s využitím jazyka Python něco vědět
5
Python / Tk: stručný průvodce
Jazyk je interpretovaný. K vaší aplikaci musí být interpret. Nebo musíte interpret do vaší aplikace „přibalit“.
Nástroje jsou zdarma (vyvíjeny jako podobně jako Linux)
Nevýhoda
Vhodný pro vytváření prototypů GUI (rychlé provádění změn).
Typické použití (v kontextu tvorby GUI)
6
Python / Tk: Vzhled programu
Vzhled programu: Definování třídy myApp, __init__ je konstruktor, onTlacitko je metoda. Zarovnávání je důležité. Konce řádků také. Pozor na dvojtečky.
class myApp:
def __init__(self, master):self.fr = Frame(master)self.bu = Button(self.fr, text='Zmackni', command=self.onTlacitko)self.fr.pack()self.bu.pack()
def onTlacitko(self):print 'Zmackl jsi.'
7
Python: Základní datové typy a přiřazování
Elementární datové typy a přiřazování
a = 77; b = 3.14c = 1.2 + 3.14jd = e = c / 2.0uro = ’URO 2003/4’nadpis = uro[0:3] + " leto" + uro[3:99]print uro, d.imag, 'ještě něco'
import mathx = math.sqrt(a)*c*cy = math.cos(b)
8
Python: Náhled na použití seznamů
Seznam a několik „cviků“ s ním.
predmety = ['URO', 'Java', 'C++', 'PG', 'DAIS']predmety.append(333)volba = predmety[0:3]volba.remove('Java')volba[0:1] = []volba.insert(0, 'neco')volba[0:0] = ['AGU', 'DZO']volba.append(predmety[4])if volba.count('C++') == 0:
volba.append('C++')volba.sort()print volba.pop(3)print 'volba:', volba; print len(volba)
9
Python: Náhled na použití slovníků
Slovník a několik „cviků“ s ním.
body = {'URO': 100, 'C++': 99, 'OOP': 98}body['Java'] = 51print body['C++']del body['OOP']print body.keys()print body.has_key('URO')for x in body.keys():
body[x]=0
10
Python: Náhled na použití slovníků
Ještě slovník
studenti = ['SOJ11', 'SLA22', 'XXX33']predmety = ['URO', 'C++', 'Java', 'OOP']vysledek = dict([(p, 0) for p in predmety])vysledky = dict([(s, vysledek) for s in studenti])print vysledkyvysledky['SOJ11']['C++'] = 51print vysledky['SOJ11']
11
Python: Náhled
Když už ani nevíme, co je v proměnné:
x = ['abc', 'neco']x = 'ahoj'x = {'nam' : 2220, 'val' : 33}
if type(x) == str: print 'Je to retezec.'elif type(x) == list: print 'Je to seznam.'elif type(x) == dict: print 'Je to slovnik.'elif type(x) == float: print 'Je to float.'else: print 'Je to neco jineho.'
12
Python: Několik dalších detailů
Získání obsahu adresáře.
import globa = glob.glob('*.py')print ab = glob.glob('menu?.py')print b
13
Python: Několik dalších detailů
Získání obsahu URL.
import urllib2f = urllib2.urlopen('http://www.vsb.cz')print f.read(100)
for line in urllib2.urlopen('http://www.fei.vsb.cz'):if 'Fax:' in line:
print line
14
Python: Několik dalších detailů
Komprese, dekomprese a získání CRC kódu.
import zlibs = 'uro0 uuro00 urro000 uroo0000 uro0 uuro00'print len(s)t = zlib.compress(s)print len(t)print zlib.decompress(t)print zlib.crc32(t)
15
Python / Tkinter
Popiska
from Tkinter import *
class myApp:def __init__(self, master):
self.fr = Frame(master)self.la = Label(self.fr, text='Toto …')self.fr.pack(); self.la.pack()self.fr.master.title('Label 1')
root = Tk()app = myApp(root)root.mainloop()
label1.py
16
Python / Tkinter
Tlačítko s obrázkem
class myApp:
def __init__(self, master):self.fr = Frame(master)master.title('Button4')self.photo = PhotoImage(file='exit.gif')self.bu = Button(self.fr, image=self.photo,
command=self.fr.quit)self.fr.pack()self.bu.pack(padx=8, pady=8)
button4.py
17
Python / Tkinter
Radio buttons
class myApp:
def __init__(self, master):
self.fo = StringVar()self.la = Label(master, text='A pair of …')
self.r1 = Radiobutton(master, text='Times',variable=self.fo, value='Times',command=self.ukaz)
self.r2 = Radiobutton(master, text='Helvetica',variable=self.fo, value='Helvetica',command=self.ukaz)
radiobutton2.py
18
Python / Tkinter
Pokračování z předchozího snímku.
master.title('Radiobutton 2')self.la.pack()self.r1.pack(side='left')self.r2.pack(side='left')
self.r1.select()self.ukaz()
def ukaz (self):
self.newFont = tkFont.Font(family=self.fo.get(), weight='bold')
self.la.configure(font=self.newFont)
radiobutton2.py
19
Python / Tkinter
Vstup
class myApp:
def __init__(self, master):self.fr = Frame(master)self.en = Entry(self.fr)self.bv = Button(self.fr, text='Vymazat',
width=10, command=self.vymaz)self.bz = Button(self.fr, text='Zpracovat',
width=10, command=self.zpracuj)self.la = Label(self.fr, foreground='red')
#Sem ještě příjdou volání pack
entry1.py
20
Python / Tkinter
Pokračování
def vymaz(self):self.en.delete(0, END)
def zpracuj(self): self.la.configure(text=self.en.get())
entry1.py
21
Python / Tkinter
Plátno s rolovacími lištami
class myApp:def __init__(self, master):
self.fr = Frame(master)self.ca = Canvas(self.fr, width=200, height=100,
scrollregion='0 0 400 250')self.sy = Scrollbar(self.fr, orient='vertical',
command=self.ca.yview)
self.ca.configure(xscrollcommand=self.sx.set,yscrollcommand=self.sy.set)
canvas3.py
22
Python / Tkinter
Pokračování
self.fr.pack()self.ca.grid(row=0, column=0)self.sy.grid(row=0, column=1, sticky='ns')self.sx.grid(row=1, column=0, sticky='we') self.li = self.ca.create_line(25, 25,
125, 125, width=2, fill='red')self.ov = self.ca.create_oval(125, 25,
225, 125, fill='blue')
canvas3.py
23
Python / Tkinter
Listbox s doplněním
class myApp:
def __init__(self, master):self.fr = Frame(master)self.li = Listbox(self.fr, width=15, height=3)
self.la = Label(self.fr, text= 'nic',foreground= 'red')
self.bu = Button(self.fr, text= 'Dopln',command=self.dopln)
self.li.insert(0, 'Tatra', 'Areo', 'Skoda')self.li.bind('<Double-B1-ButtonRelease>',
self.liTakeOver) listbox1.py
24
Python / Tkinter
Pokračování: Doplnění a převzetí výběru.
def dopln(self):self.li.insert(END, 'Wikov', 'Jawa')self.li.configure(height=self.li.cget('height')+2)self.bu.configure(state='disabled')
def liTakeOver(self, event):self.la.configure(text=self.li.get('active'))# Také lze: get(ACTIVE)
listbox1.py
25
Python / Tkinter
Spinbox s čísly
class myApp:def __init__(self, master):
self.fr = Frame(master)self.sb = Spinbox(self.fr, fr=2.0, to=3.0,
increment=0.1)self.la = Label(self.fr, foreground='red')self.bu = Button(self.fr, text='OK',
command=self.buok)self.sb.set(2.5) # Pozor: doplnit do Tkinter!
def buok(self):self.la.configure(text=self.sb.get())
spinbox2.py
26
Python / Tkinter
class myApp: def __init__(self, master):
self.menubar = Menu(master) self.cascmenu = Menu(self.menubar, tearoff=0)self.imgCopy = PhotoImage(file='copy.gif')self.cascmenu.add_command(compound='left',
image=self.imgCopy, label='Copy', underline=0, command=self.copy)
menu4.py
Kaskádová menu s obrázky
27
Python / Tkinter
Pokračování
self.filemenu = Menu(self.menubar, tearoff=0)self.filemenu.add_cascade(label='Kaskada... ',
underline=0, menu=self.cascmenu)
self.menubar.add_cascade(label='File',menu=self.filemenu)
master.config(menu=self.menubar)menu4.py
28
Python / Tkinter
Ještě několik vazeb na události
master.bind('<Button-1>', self.showFileMenu)master.bind('<Key-F1>', self.showMessage)master.bind('<Control-c>', self.appExit)
def showFileMenu(self, event):self.filemenu.post(event.x_root, event.y_root)
def showMessage(self, event):tkMessageBox.showinfo('Info', 'URO 2003-4...')
def appExit(self, event):self.fr.quit()
menu3.py
29
Python:
Vytvoření nových modulů pro Python.
Zabalení interpreteru Python do aplikace.
Python / C API
30
Python / Tkinter - Co dál? (chcete-li)…
Jazyk
http://www.python.org
Navštivte
uro\texty\python-tutorial.pdf
Tkinter
uro\texty\an-introdiction-to-tkinter.pdf
uro\texty\tkinter.pdf