Wykład 5. 9 listopada 2009 1 Rodzaje parametrów funkcji 2 3 4
Parametry domyślne Wartość domyślna parametrów def log(val, base=2.718281):... def foo(arg1=[], arg2="dwa", arg3=3): print log(34, 10), log(12) print foo([1,2,3], "abcd", 12) print foo([1,2,3], "abcd") print foo([1,2,3]) print foo()
Parametry domyślne Wartość domyślna parametrów def log(val, base=2.718281):... def foo(arg1=[], arg2="dwa", arg3=3): print log(34, 10), log(12) print foo([1,2,3], "abcd", 12) print foo([1,2,3], "abcd") print foo([1,2,3]) print foo()
Uwagi Rodzaje parametrów funkcji Uwaga Wartości domyślne parametrów są obliczane tylko raz def f(a, L=[]): L.append(a) return L Rezultat >>> print f(1) [1] >>> print f(2) [1, 2] >>> print f(3) [1, 2, 3]
Uwagi Rodzaje parametrów funkcji Uwaga Wartości domyślne parametrów są obliczane tylko raz def f(a, L=[]): L.append(a) return L Rezultat >>> print f(1) [1] >>> print f(2) [1, 2] >>> print f(3) [1, 2, 3]
Argumenty nazwane def html_e(body="", color="navyblue", font="arial", f_size="12"): return... html_elem(color="white", body="a kuku")
Argumenty nazwane def html_e(body="", color="navyblue", font="arial", f_size="12"): return... html_elem(color="white", body="a kuku")
Funkcje ze zmienną liczbą argumentów def my_print(prompt=">>>", *args): for a in args: print prompt, e my_print("one") my_print("jeden", 2) my_print("jeden", 2, [1,2,3])
Funkcje ze zmienną liczbą argumentów def my_print(prompt=">>>", *args): for a in args: print prompt, e my_print("one") my_print("jeden", 2) my_print("jeden", 2, [1,2,3])
Parametry kluczowe def html_attrs(**attrs): for (attr, val) in attrs.iteritems(): print attr, =, val html_attrs(id= 123, name= ozdobnik, color= red )
Parametry kluczowe def html_attrs(**attrs): for (attr, val) in attrs.iteritems(): print attr, =, val html_attrs(id= 123, name= ozdobnik, color= red )
Mieszanie argumentów def html_ul(comment="", *ul_list, **attribs):
Biblioteki graficzne w Pythonie curses: interfejs tekstowy Tkinter (Tk interface): biblioteka okienkowa Tk + Tix (Tk extension) Pygtk, pygnome: API do środowiska Gtk/Gnome PyQT: API do QT wxwindows OpenGL PyWin32
Tkinter Rodzaje parametrów funkcji Elementy składowe Okna Kontrolki (widgety) Zdarzenia i funkcje zwrotne (callbacks)
Przykład Rodzaje parametrów funkcji Aplikacja, która rysuje figury zadane przez użytkownika czyści ekran na żądanie
Wynik Rodzaje parametrów funkcji
Kontrolki Rodzaje parametrów funkcji inter (tkinter w 3.0): class Frame(Widget): okno class Entry(Widget): wpisywanie tekstu class Label(Widget): tekst class Menu(Widget): menu
Kontrolki w akcji Menu Entry Label Button
Rysowanie, klasa Canvas
Schemat implementacji from Tkinter import * from turtle import * class Application(Frame):... app = Application() app.master.title("rysownik") app.mainloop()
Konstruktor klasy class Application def init (self, master=none): Frame. init (self, master) self.grid() self.createwidgets()
Utworzenie kontrolek, cz. 1 def createwidgets(self): self.mk_menu() self.label = Label(self, text = "Jaką figurę narysować?") self.label.grid() self.entry = Entry(self) self.entry.grid()
Utworzenie kontrolek, cz. 2 cd. metody def createwidgets(self) self.cs = Canvas(self) self.cs.grid() self.quitbutton = Button(self, text="koniec", command=self.quit) self.quitbutton.grid()
Utworzenie menu def mk_menu(self): self.mb = Menubutton(self, text= Plik ) self.mb.grid(sticky=nw) self.menu = Menu(self.mb) self.mb["menu"] = self.menu self.menu.add_command(label= Rysuj, command = self.cb_rysuj) self.menu.add_command(label= Wyczyść, command = lambda : self.cs.delete( all ))
Funkcje zwrotne Każde kliknięcie na kontrolkę powoduje wywołanie zdarzenia Zdarzenie może być obsłużony przez funkcję zwrotną (callback)
Implementacja funkcji zwrotnej Metoda klasy Application def cb_rysuj(self): self.pen = RawPen(self.cs) if self.entry.get().strip() == kwadrat : for i in range(4): self.pen.forward(60) self.pen.right(90) else: for dist in range(40): self.pen.forward(4*dist) self.pen.right(90) Podłączanie obsługi zdarzeń self.menu.add_command(label= Rysuj, command = self.cb_rysuj)
Implementacja funkcji zwrotnej Metoda klasy Application def cb_rysuj(self): self.pen = RawPen(self.cs) if self.entry.get().strip() == kwadrat : for i in range(4): self.pen.forward(60) self.pen.right(90) else: for dist in range(40): self.pen.forward(4*dist) self.pen.right(90) Podłączanie obsługi zdarzeń self.menu.add_command(label= Rysuj, command = self.cb_rysuj)
Zarządzanie układem kontrolek w oknie: model grid class Application def init (self, master=none): Frame. init (self, master) self.grid()...
Model grid Rodzaje parametrów funkcji
Metoda grid Rodzaje parametrów funkcji.grid(): umieszczenie kontrolki w kolejnym wierszu okna.grid(column=1, row=2).grid(columnspan=2, rowspan=3)
Przykład: klawiatura numeryczna Źródło: Wikipedia
Implementacja col = 0 for sgn in [ NumL, /, *, - ]: wgt = Button(self, text=sgn) wgt.grid(row=1, column=col) col += 1 for num in range(9): wgt = Button(self, text=str(num + 1)) wgt.grid(row= 4 - num/3, column = num % 3)
Implementacja, cd wgt = Button(self, text= - ) wgt.grid(row=1, column=3) wgt = Button(self, text= + ) wgt.grid(row=2, column=3, rowspan=2) wgt = Button(self, text= Enter ) wgt.grid(row=4, column=3, rowspan=2) wgt = Button(self, text= 0 ) wgt.grid(row=5, column=0, columnspan=2) wgt = Button(self, text= Del ) wgt.grid(row=5, column=2)
Wynik ;-) Rodzaje parametrów funkcji
Wynik ;-) Rodzaje parametrów funkcji
Położenie kontrolki w komórce NW N NE W CENTER E SW S SE
Umieszczenie kontrolki w komórce self.mb = Menubutton(self, text= Plik ) self.mb.grid(sticky=nw)
Upiększanie kontrolek Zmiana kolorów bt = Button(self, text= koniec, background= red, foreground= #00ffff ) Zmiana czcionek import tkfont font = tkfont.font(family= Helvetica, size=18) self.label = Label(self, text = "to jest tekst", font=font)
Upiększanie kontrolek Zmiana kolorów bt = Button(self, text= koniec, background= red, foreground= #00ffff ) Zmiana czcionek import tkfont font = tkfont.font(family= Helvetica, size=18) self.label = Label(self, text = "to jest tekst", font=font)
Inicjowanie grafiki żółwiowej class Keypad def cb_rysuj(self): self.pen = RawPen(self.cs) if self.entry.get().strip() == kwadrat : for i in range(4): self.pen.forward(60) self.pen.right(90) else: for dist in range(40): self.pen.forward(4*dist) self.pen.right(90)
Poruszanie pisakiem forward(odległość) backward(odległość) goto(x, y)
Konfiguracja sposobu pisania up() down() width(szerokość) color(r, g, b) color(s)
Zmiana kierunku pisania left(kąt) right(kąt) setheading(kąt)
Demo Rodzaje parametrów funkcji >>> import turtle >>> turtle.demo()