300 likes | 433 Views
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č?.
E N D
Eduard Sojka URO, Léto 2003/4 VŠB – Technická univerzita Ostrava Stručný průvodce vytvářením GUIv Python / Tk
Python / Tk: stručný průvodce Skript. jazyk Knih. GUI 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í.
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. classmyApp: 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] printuro, 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]) ifvolba.count('C++') == 0: volba.append('C++') volba.sort() printvolba.pop(3) print'volba:', volba; printlen(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 printbody['C++'] delbody['OOP'] printbody.keys() printbody.has_key('URO') forxinbody.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 pin predmety]) vysledky = dict([(s, vysledek) forsin studenti]) printvysledky vysledky['SOJ11']['C++'] = 51 printvysledky['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') printa b = glob.glob('menu?.py') printb
Python: Několik dalších detailů Získání obsahu URL. import urllib2 f = urllib2.urlopen('http://www.vsb.cz') printf.read(100) forlinein urllib2.urlopen('http://www.fei.vsb.cz'): if'Fax:'inline: printline
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)
Python / Tkinter Popiska from Tkinter import * classmyApp: 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
Python / Tkinter Tlačítko s obrázkem classmyApp: 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
Python / Tkinter Radio buttons classmyApp: 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
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
Python / Tkinter Vstup classmyApp: 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
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
Python / Tkinter Plátno s rolovacími lištami classmyApp: 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
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
Python / Tkinter Listbox s doplněním classmyApp: 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
Python / Tkinter Pokračování: Doplnění a převzetí výběru. defdopln(self): self.li.insert(END, 'Wikov', 'Jawa') self.li.configure(height=self.li.cget('height')+2) self.bu.configure(state='disabled') defliTakeOver(self, event): self.la.configure(text=self.li.get('active')) # Také lze: get(ACTIVE) listbox1.py
Python / Tkinter Spinbox s čísly classmyApp: 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! defbuok(self): self.la.configure(text=self.sb.get()) spinbox2.py
Python / Tkinter Kaskádová menu s obrázky classmyApp: 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
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
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) defshowFileMenu(self, event): self.filemenu.post(event.x_root, event.y_root) defshowMessage(self, event): tkMessageBox.showinfo('Info', 'URO 2003-4...') defappExit(self, event): self.fr.quit() menu3.py
Python: Python / C API 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