Stručný průvodce vytvářením GUI v Python / Tk Eduard Sojka URO, Léto 2003/4 VŠB – Technická univerzita Ostrava
Python / Tk: stručný průvodce Co děláme? Proč? 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í. Knih. GUI Skript. jazyk
Python / Tk: stručný průvodce Co je Python, Tkinter? 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++).
Python / Tk: stručný průvodce Několik důvodů, proč byste mohli o tvorbě GUI s využitím jazyka Python něco vědět 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).
Python / Tk: stručný průvodce Nevýhoda 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) Typické použití (v kontextu tvorby GUI) Vhodný pro vytváření prototypů GUI (rychlé provádění změn).
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.'
Python: Základní datové typy a přiřazování Elementární datové typy a přiřazování a = 77; b = 3.14 c = 1.2 + 3.14j d = e = c / 2.0 uro = ’URO 2003/4’ nadpis = uro[0:3] + " leto" + uro[3:99] print uro, d.imag, 'ještě něco' import math x = math.sqrt(a)*c*c y = math.cos(b)
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)
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'] = 51 print body['C++'] del body['OOP'] print body.keys() print body.has_key('URO') for x in body.keys(): body[x]=0
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 vysledky vysledky['SOJ11']['C++'] = 51 print vysledky['SOJ11']
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.'
Python: Několik dalších detailů Získání obsahu adresáře. import glob a = glob.glob('*.py') print a b = glob.glob('menu?.py') print b
Python: Několik dalších detailů Získání obsahu URL. import urllib2 f = 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
Python: Několik dalších detailů Komprese, dekomprese a získání CRC kódu. import zlib s = 'uro0 uuro00 urro000 uroo0000 uro0 uuro00' print len(s) t = zlib.compress(s) print len(t) print zlib.decompress(t) print zlib.crc32(t)
def __init__(self, master): self.fr = Frame(master) 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
def __init__(self, master): self.fr = Frame(master) 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
def __init__(self, master): self.fo = StringVar() 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', radiobutton2.py
Pokračování z předchozího snímku. 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
def __init__(self, master): self.fr = Frame(master) 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
self.la.configure(text=self.en.get()) 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
Plátno s rolovacími lištami 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
self.ca.grid(row=0, column=0) 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
def __init__(self, master): self.fr = Frame(master) 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
Pokračování: Doplnění a převzetí výběru. 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
def __init__(self, master): self.fr = Frame(master) 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
Kaskádová menu s obrázky Python / Tkinter Kaskádová menu s obrázky 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
self.filemenu = Menu(self.menubar, tearoff=0) 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
Ještě několik vazeb na události 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
Python / C API Python: Vytvoření nových modulů pro Python. Zabalení interpreteru Python do aplikace.
Python / Tkinter - Co dál? (chcete-li)… Jazyk uro\texty\python-tutorial.pdf Tkinter uro\texty\an-introdiction-to-tkinter.pdf uro\texty\tkinter.pdf Navštivte http://www.python.org