Wykład 4: GUI
Widget. Opis
Button Prosty przycisk używany do wykonywania procedur lub innych operacji
Canvas Struktura graficzna. Ten widget może być używany do rysowania grafów i wykresów i tworzenia graficznych edytorów
Checkbutton Reprezentuje zmienną, która może przyjmować dwie różne wartości. Klikając zmienia się wartość tej zmiennej na drugą
Entry Pole do wpisania tekstu.
Frame Kontener na widgety. Może mieć ramkę i tło, i jest używane do grupowania widgetów
Label Wyświetla tekst lub obraz
Listbox Wyświetla listę do wyboru. Ta lista może być skonfigurowana jak radiobutton albo jak checklist.
Menu Panel menu. Używane do implementowania rozwijalnego menu.
Menubutton Używane do implementowania rozwijalnego menu.
Message Wyświetla tekst, podobny do label ale może dostosować sam rozmiar tekstu do zadanej szerokości i proporcji
Radiobutton Reprezentuje jedną wartość lub zmienną która może przyjmować jedną z wielu wartości
Scale. Pozwala ustawić wartość liczbową przez kliknięcie na skali Scrollbar Standartowy scrollbar do użycia z canvas, entry, listbox i text.
Text. Pozwala wyświetlać i edytować tekst z różnymi stylami i atrybutami. Także umożliwia wyświetlanie obrazów i okien
Toplevel Kontener widgetów wyświetlanych jako osobne okno
Zalety Tkintera
Jedyny GUI pakowany z samym Python
Oparty ma Tcl/Tk, popularnym open- source
języku skryptowym do tworzenia
widgetówGUI przez John Ousterhout (90s)
Tk jest używany przez różne języki (Perl, Ruby, PHP, etc.)
Występuje na różnych platformach (Unix/Windows/MacOS)
Jest mały (~25 podstawowych widgets)
Tkinter na skróty
Krótki przykład:
>>> from Tkinter import Label
>>> x = Label(None,text="Hello World")
>>> x.pack()
>>> x.mainloop()
Wyjście:
Tkinter na skróty
Inny przykład:
>>> def response():
... print "You did it!"
...
>>> from Tkinter import Button
>>> x = Button(None,text="Do it!",command=response)
>>> x.pack()
>>> x.mainloop()
Wyjście:
You did it!
You did it!
…
Typowe kroki Tkintera
Typowe etapy pracy Tkintera
Utwórz i skonfiguruj widget (labels, buttons, sliders, etc.)
Spakuj go (geometria)
Implementuj funkcje które odpowiadają różnym zdarzeniom GUI (event handling)
Uruchom główną pętlę zdarzeń
Okno roota
GUI istnieje w co najmniej jednym graficznym oknie
Oto .... puste okno (bez widgeta)
To okno nazywa się oknem "root”
Zwykle mamy tylko jednio okni roota w aplikacji
Aby stworzyć okno roota piszemy:
>>> from Tkinter import *
>>> root = Tk(className="ApplicationName")
>>>
Aby uruchomić GUI, uruchom główna pętlę zdarzeń:
>>> root.mainloop()
Widgety
Widgets sa elementami graficznymi
>>> from Tkinter import *
>>> root = Tk()
>>> b= Button(root,text="A Button")
>>> b.pack()
root – skąd ten widget, wszystkie widgety należą do jakichś okien
text – co na widgecie
Widgety - konfiguracja
Widgety mają opcje konfiguracji:
>>> b = Button(root,text="A
Button",bg="blue",fg="white")
i mogą być w dowolnej chwili rekonfigurowane
>>> b.config(bg="red") # Change background
Pokaż bieżący parametr konfiguracji cget():
>>> b.cget("bg") 'red'
>>>
Zdarzenia widgeta
Zdarzenia widgeta:
>>> def pressed():
... print "You pressed it!"
...
>>> b = Button(root,text="A Button",command=pressed)
Typy zdarzeń (events) i sposób postępowania
zależą od widgeta (np., inne dla button i inne
dla scrollbar)
Stan widgeta
Widgety mają związane z nimi zmienne:
>>> svalue = StringVar()
>>> w = Entry(root,textvariable=svalue) ivar = IntVar()
svar = StringVar() dvar = DoubleVar() bvar = BooleanVar()
Przykład: Text entry
>>> svalue.get()
'This is a test'
Widgety jako blok
Geometrie Tkintera
Geometria Opis
Grid Geometria grid pozwala organizować widgety w 2-wymiarowej siatce. Aby używać tej geometrii stosuj metodę grid
Pack Geometria pack zarządza widgetami pakując widgety do ramki i traktując je jako regularne prostokątne bloki. Aby ją używać stosujemy metodę pack.
Place Geometria place umieszcza widget w zadanej współrządnymi pozycji, aby ją stosować używamy metody place.
Geometria grid
Opcja Typ Opis
column, row Integer Wstawia widget do tej kolumny/wiersza (domyślna 0) columnspan
rowspan
Integer Jeśli jest wskazuje na ilu więcej kolumnach/wierszach widget ma się rozpiąć
in_ Widget Umieszcza widget wewnątrz zadanego widgetu. Można umieścić widget tylko wewnątrz widgetu rodziciela (bazowego)
ipadx, ipady Distance Opcjonalne podanie miejsca na widget w komórce względem brzegu komórki (domyślne 0)
padx, pady Distance Opcjonalne podanie miejsca na widget w komórce (domyślne 0)
sticky constant Definiujemy jak rozciągnąć widget w komórce jeśli jest
ona większa od widgetu. Może to być kombinacja
stałych S,N,W,E,NW,NE,SW i SE. Np. W+E oznacza
że widget może być rozciągnięty w poziomie.
Geometria grid
w.grid_configure(option=value, ...) - Umieść widget w siatce grid opisanej opcjami.
w.grid_forget() - Usuń widget z siatki (może on być dalej przetwarzany)
w.grid_info() - Zwraca słownik opisujący bieżące opcje.
w.grid_remove() - Tak jak grid_forget()
w.columnconfigure(column, option=value, …)
w.rowconfigure(row, option=value, …)
Opcja Znaczenie
minsize Minimalny rozmiar w pikselach kolumny lub wiersza. Jeśli nie ma nic w tej kolumnie/wierszu to on się nie pojawi (nawet jeśli użyjesz tej opcji)
pad Liczba pikseli które będą dodane do zadanego wiersza/ kolumny wokół największej komórki w tym wierszu/kolumnie
weight
To polecenie robi wiersze/kolumny proporcjonalnymi. Nadajemy wierszom/kolumnom odpowiednie wagi w z ależności od tego ile z wolnej przestrzeni można dodać tym wierszom/kolumnom. Na przykład, jeśli widget w ma mieć ¾ wolnej przestrzeni w pier - wszej (nr 0) kolumnie i ¼ w drugiej (nr 1) to piszemy (waga domyślna wynosi 0):
w.columnconfigure(0, weight=3) w. columnconfigure(1, weight=1)
Geometria pack - side
w.pack(side=TOP) w.pack(side=LEFT)
w.pack(side=BOTTOM) w.pack(side=RIGHT)
Geometria pack - anchor
w.pack(side=TOP,anchor=W)
w.pack(side=LEFT, anchor=E)
Możliwe anchor
E,W,N,S,NW,NE,SW,SE
Geometria pack – jak to działa
>>> root = Tk()
>>> b1 = Button(root,text="Button 1")
>>> b2 = Button(root,text="Button 2")
>>> b3 = Button(root,text="Button 3")
>>> b1.pack(side=TOP)
>>> b2.pack(side=LEFT)
>>> b3.pack(side=BOTTOM)
>>> root.mainloop()
Geometria pack
Np..
Button(master, text=’Przycisk 1’).pack(side=LEFT)
Button(master, text=’Przycisk 2’).pack(side=LEFT)
Button(master, text=’Przycisk 3’).pack(side=LEFT)
W geometrii pack, traktując ramkę jako wolny obszar do wstawiania, staramy się po kolei wg. zamieszczonych opcji side wstawiać widgety. Opcje padx, pady to
odstępy pomiędzy komórkami na widgety w poziomie i
pionie, opcje anchor i fill związane są z tym, gdzie dany
widget w komórce ma być umieszczony (jeśli jest jakieś
wolne miejsce w komórce) a opcja expand kontroluje,
czy widget będzie się rozszerzał, gdy użytkownik będzie
całe okno powiększał.
Geometria pack – fill
>>> Button(root,text="tiny").pack()
>>> Button(root,text="humongous").pack()
>>> Button(root,text="tiny").pack(fill=X)
>>> Button(root,text="humongous").pack(fill=X)
Geometria pack – expand
>>> Button(root,text="tiny").pack(fill=X)
>>> Button(root,text="humongous").pack(fill=X)
>>> w = Label(root,text="Label",bg="blue",fg="white")
>>> w.pack(fill=X)
>>> Button(root,text="tiny").pack(fill=X)
>>> Button(root,text="humongous").pack(fill=X)
>>> w = Label(root,text="Label",bg="blue",fg="white")
>>> w.pack(fill=BOTH,expand=True)
Geometria pack – frame
Frame są jak podokna
Przestrzeń pomiędzy widgetami
Używane do grupowania widgetów
Aby wyrównac widgety
>>> root = Tk()
>>> f1 = Frame(root)
>>> f2 = Frame(root)
>>> f3 = Frame(root)
>>> f1.pack(side=TOP)
>>> f2.pack(side=LEFT)
>>> f3.pack(side=RIGHT)
Geometria pack
Np..
Button(master, text=’Przycisk 1’).pack(side=LEFT)
Button(master, text=’Przycisk 2’).pack(side=LEFT)
Button(master, text=’Przycisk 3’).pack(side=LEFT)
W geometrii pack, traktując ramkę jako wolny obszar do wstawiania, staramy się po kolei wg. zamieszczonych opcji side wstawiać widgety. Opcje padx, pady to
odstępy pomiędzy komórkami na widgety w poziomie i
pionie, opcje anchor i fill związane są z tym, gdzie dany
widget w komórce ma być umieszczony (jeśli jest jakieś
wolne miejsce w komórce) a opcja expand kontroluje,
czy widget będzie się rozszerzał, gdy użytkownik będzie
całe okno powiększał.
Geometria place
w.place(relx=x,rely=y,anchor=tekst,bordermode=INSIDE/
OUTSIDE)
gdzie x, y są to liczby rzeczywiste z przedziału (0,1)
oznaczające względne położenie widgetu (współrzędne x i y razy rozmiar ramki) natomiast anchor jest którymś z tekstów: ’n’, ’ne’, ’e’, ’se’, ’s’, ’sw’, ’w’, ’nw’ lub ’center’
(można też używać stałych N, W ,...). Możliwe jest też umiejscowienie widgetu w pixelach (x=liczba, y=liczba), może być podana jego wysokość
i długość (width=liczba, height=liczba) albo względna długość/wysokość (relwidth=liczba, relheight=liczba).
Metoda w.place_info() zwraca słownik
z bieżącymi ustawieniami place.
Fonty
1.Deskryptory fontów: są to krotki np. („Times”, 10, „bold”), („Helvetica”, 10, „bold italic”), („Symbol”, 8), a jeśli nazwa fontu nie ma znaku spacji to mogą te elementy wystąpić w jednym łańcuchu np. “Times 10 bold”, “Helvetica 10 bold italic”, “Symbol 8”
2. Zdefiniowane przez użytkownika nazwy fontów: Moduł tkFont określa klasę Font, dla której można utworzyć instancję, np.
tkFont.Font(family=”Tahoma”,size=10,weight=tkFont.BOLD, slant=tkFont.ITALIC)
Atrybuty klasy fontów są następujące:
family typu string. Nazwa rodziny fontów..
size typu integer. Rozmiar fontu w punktach, jeśli size>0 i w pixelach jeśli ujemne.
weight grubość fontu. Używaj NORMAL(domyślne) lub BOLD.
slant używaj NORMAL(domyślne) lub ITALIC.
underline wartość logiczna jeśli 1 (True) to podkreślony, domyślny 0.
overstrike wartość logiczna gdy 1 (True) to przekreślony, domyślny 0.
F.actual([font_option]) Zwraca słownik ze wszystkimi ustawieniami fontu F. Jeżeli występuje font_option to zwraca tylko wartość ustawionej opcji.
list(tkFont . families())
3. Deskryptory X fontów opisane w bibliotece Tk. Np.
-*-family-weight-slant-*--*-size-*-*-*-*-charset
Tkinter umożliwia również wielolinijkowe napisy (przez wstawienie “\n”). Domyślnie tekst jest centrowany, ale możliwe jest ustawienie tekstów z lewej lub prawej strony. Tekst ponadto może mieć opcję relief przyjmująca wartości: SUNKEN, RAISED, GROOVE, RIDGE lub FLAT.
Kolory
Na platformie Tkintera możemy używać kolorów zdefiniowanych przez wartości RGB:
#RGB 4-bitowe wartości (16 kolorów)
#RRGGBB 8-bitowe wartości (256 kolorów)
#RRRRGGGGBBBB 16-bitowe wartości (65526 kolorów)
np.
self.specialColor = ’#00ffdd’
natomiast aby odczytać kolor widgetu używamy
rgb = widget.winfo_rgb(”red”)
red, green, blue = rgb[0]/256, rgb[1]/256, rgb[2]/256
dzielimy przez 256 bo rgb[...] ma wartości całkowite od 0 do 255.
Możliwe są też nazwy mnemoniczne jak green czy white.
from tkColorChooser import askcolor
askcolor()
Kursor
fm = Frame(master, cursor=’crosshair’)
1. X-cursor, arrow, based_arrow_down, based_arrow_up, boat, logosity, bottom_left_corner, bottom_right_corner, bottom_side, boyttom_tee, box_spiral, center_ptr,
2. circle, clock, coffee_mug, cross, cross_reverse, cross_hair, diamond_cross, dot, dotbox, double_arrow, draft_large, draft_small,
3. drapped_box, exchange, fleur, gobbler, gumby, hand1, hand2, heart, icon, iron_cross, left_ptr, left_side, 4. left_tee, leftbutton, Il_angle, Ir_angle, man, middlebutton, mouse, pencil, pirate, plus, question_arrow,
right_ptr,
5. right_side, right_tee, rigthbutton, rtl_logo, sailboat, sb_down_arrow,
sb_h_double_arrow,sb_left_arrow,sb_right_arrow,sb_up_arrow, sb_v_double_arrow,
6. shuttle, sizing, spider, spraycan, star, target, tcross, top_left_arrow, top_left_corner, top_right_corner, top_side, top_tee, trek
7. ul_angle, umbrella, ur_angle, watch, xterm
Atrybuty obiektu widget
Opcja Opis Jednostka Domyślna Widgetami
background (bg)
Kolor tła color ‘gray25’
‘#FF4400’ wszystkie borderwidth
(bd)
Szerokość 3D ramki pixel 3 wszystkie
cursor Kształt kursora cursor gumby wszystkie Font Opis fontu font ‘Helvetica’ wszystkie poza
Canvas. Frame, Scrollbar, Toplevel foreground
(fg)
Kolor pierwszego planu color ‘black’
‘#FF2244” wszystkie poza Canvas, Frame, Scrollbar, Toplevel highlight-
background
Kolor tła, gdy widget nie ma focusa
color ‘gray30’ wszystkie poza Menu highlight-
color
Kolor zaznaczonego fragmentu, gdy ma fokus
color ‘royalblue’ wszystkie poza Menu highlight-
thickness
Szerokość podświetlanego prostokąta, gdy widget ma fokus
pixel 2 wszystkie poza
Menu
relief Efekt 3D dla widgetu constant RAISED lub GROOVE
wszystkie
takefocus Czy widget ma mieć focus podczas wpisywania przez klawiaturę
boolean 1 YES wszystkie
width,height Szerokość/wysokość widgetu w przeciętnej szerokości znaku fonta widgetu
integer 32/14 wszystkie poza Menu/ Button Canvas Checkbutton Frame Label Listbox Menubutton Radiobutton Text Toplevel activeback-
ground activefore- ground
Kolor tła/elementu kiedy przechodzimy aktywny element
color ‘red’
‘#fa07a3’
‘cadet- blue’
Button, Checkbutton, Menu, Menubutton, Radiobutton, Scale, Scrollbar anchor W którym miejscu
widgetu ma być umieszczony tekst lub bitmapa (N, NE, E, SE, S, SW, W, NW, lub CENTER)
constant Button, Label,
Checkbutton, Message, Menubutton, Radiobutton bitmap Jaka bitmapa (ikona) ma bitmap Button, Label,
image Jaki obraz ma być importowany
image Button,
Checkbutton, Label, Menubutton, Radiobutton justify Gdy jest wielolinijkowy
tekst w widgecie – to sposób justyfikacji (LEFT,CENTER,RIGHT)
constant RIGHT Button, Entry, Checkbutton, Label, Menubutton, Message, Radiobutton padx, pady Dodatkowa przestrzeń
wokół widgetu
pixel 10/12 Button, Checkbutton, Label, Manubutton, Message, Radiobutton, Text selectback-
ground selectfore- ground selectborder width
Kolor tła/ kolor pierwszego
planu/szerokość ramki
color/col orpixel
blue/
yellow/3
Canvas, Entry, Listbox, Text
state Jeden z dwóch stanów:
ACTIVE, DISABLED
constant ACTIVE Button Checkbutton Entry Menubutton Radiobutton Scale Text text
textvariable
Tekst wewnątrz widgetu.
Zmienna typu string zawierająca tekst dla widgetu
zmienna ‘Display this’/widge tContent
Button Checkbutton Entry Label Menubutton Message Radiobutton underline Numer znaku, który ma
być podkreślony w tekście widgetu
integer 2 Button
Checkbutton Label Menubutton Radiobutton wraplength Maksymalna długość linii
tekstu
pixel 41 Button
Checkbutton Label Menubutton Radiobutton xscrollcom- Funkcja użyta do function Canvas, Entry,
Metody (niektóre) obiektu widget
after(ms, function=None, *args) wywołuje procedurę po ms millisekundach
after_cancel(id) zamyka obiekt.
after_idle(function, *args) wywołuje funkcję po stanie bezczynności.
bell(displayof=0) sygnał dźwiękowy
bind(sequence=None, function=None, add=None) kojarzy obsługę zdarzeń ze zdarzeniem.
bind_all(sequence=None, function=None, add=None) kojarzy obsługę zdarzeń ze
zdarzeniami wszystkich poziomów.
cget(key) zwraca wartość konfiguracji danego widgetu.
clipboard_append(string) dopisuje tekst do rysunku.
config(**options) bez parametru – wartość konfiguracji widgetu (słownik), z
parametrem ustawia konfigurację widgetu
destroy() niszczy widget
focus_displayof() zwraca nazwę okna w którym widget jest wyświetlany.
focus_get() zwraca identyfikator okna z fokusem.
focus_set() ustawia fokus i klawiaturę na widget
getvar(name='PY_VAR') zwraca wartość zmiennej o podanej nazwie.
grab_current() zwraca nazwę bieżącego okna
image_names() zwraca listę zawierającą nazwy wszystkich używanych obrazów.
image_types() zwraca listę zawierającą typy wszystkich używanych obrazów.
mainloop rozpoczyna pętlę Tkintera
quit() wyjście z mainloop.
selection_clear() czyści wybrany fragment widgetu.
selection_get() zwraca wartość wybraną w widgecie.
selection_handle(handler) tworzy obsługę zdarzenia wybrania fragmentu widgetu.
setvar(name='PY_VAR', value ='1') ustawia zmienną na podaną wartość.
Widget Toplevel
root = Tk()
t1 = Toplevel(root)
t2 = Toplevel(root)
t2.transient(root)
t3 = Toplevel(root, borderwidth=5, bg=’blue’)
t3.overrideredirect(1)
Widget Frame
f = Frame(root, width=300, height=110)
xf = Frame(f, relief=GROOVE, borderwidth=2)
Label(xf, text=u”W\u0107isnij go!”).pack(pady=10)
Button(xf, text=”Pierwszy!”, state=DISABLED).pack(
side=LEFT, padx=5, pady=8)
Button(xf, text=”Drugi!”, command=root.quit).pack(
side=RIGHT, padx=5, pady=8)
xf.place(relx=0.01, rely=0.125, anchor=NW)
Label(f, text=’Ta ramka ma tekst’).place(relx=.06,
rely=0.125, anchor=W)
f.pack()
Widgety Label i Button
self.Label1 = Label(self, text = ”Etykieta tekstowa”)
self.Label2 = Label(self,text = ”Etykieta tekstowa z ikona” )
self.Label3 = Label( self, bitmap = ”warning” )
self.label3 = Label(self, image=photo )
Button(xf,text=”Pierwszy!”,
state=DISABLED).pack(side=LEFT, padx=5, pady=8)
Button(xf,text=”Drugi!”,
command=root.quit).pack(side=RIGHT, padx=5,pady=8)
Widget Entry
value = StringVar()
self.text1 = Entry(self.frame1,name =”tekst 1”,textvariable’value)
self.text1.bind(”<Return>”, self.showContents)
print value.get()
self.text2 = Entry(self.frame1, name =”tekst2”)
self.text2.insert(INSERT, ” Wpisz tekst tutaj”)
self.text2.bind(”<Return>”, self.showContents)
self.text3 = Entry(self.frame2,name= ”tekst 3”)
self.text3.insert(INSERT,” Pole nieedytowalne”)
self.text3.config( state = DISABLED )
self.text3.bind(”<Return>”, self.showContents )
self.text4 = Entry(self.frame2, name = ”tekst
4”, show = ”*” )
self.text4.insert( INSERT, ”Tekst ukryty” )
self.text4.bind(”<Return>”, self.showContents)
Widget Radiobutton
svar=StringVar()
for text, value in [(’Podstawowe’, 1), (u’Niepe\u0142ne
\u015brednie’, 2), (u’\u015arednie’, 3), (u’Niepe\u0142ne wy\u017csze’, 4), (u’Wy\u017csze’,
5),(’Brak danych’, 6)]:
Radiobutton(root, text=text, value=value, variable=svar).pack(anchor=W)
print svar.get()
„Średnie”
Widget Checkbutton
zmienna=StringVar(value=‘Ernest Hemingway’)
for poet, row, col, status in [(’Ernest Hemingway’, 0, 0, NORMAL),
(’Joseph Conrad Korzeniowski’, 0, 1, NORMAL), (’Cyprian Norwid’, 1, 0, DISABLED), (’Allan Edgar Poe’, 1, 1, NORMAL), (’Adam Mickiewicz’, 2, 0, NORMAL), (’Julian Tuwim’, 2, 1, NORMAL)]:
setattr(var, poet, IntVar())
Checkbutton(root, text=poet, state=status, anchor=W, variable
= getattr(var, poet), variable=zmienna, variable=poet).grid(row=row, column=col, sticky=W)
print zmienna.get()
Widget Scale
>>> temp = IntVar()
>>> def on_move(value):
... print "moved", value ...
>>> w = Scale(root,label="Temperature",variable=temp, ... from_=0,to=100,tickinterval=50,
... orient='horizontal',command=on_move) ...
>>>
Widget Scale
self.control = Scale( self, from_ = 0, to = 200,
orient = HORIZONTAL, command=self.updateCircle)
self.control.pack( side = BOTTOM, fill = X )
Widget Scrollbar
Scrollbar
>>> w =
Scrollbar(root,orient="vertical")
Widget Menu: CommandMenu,
CascadeMenu, CheckbuttonMenu,
RadiobuttonMenu, DisabledMenu
Widget Message
Message(root, text=u"P… ”, bg=’yellow’,
fg=’#0537FF’,relief=GROOVE).pack(padx=10, pady=10)
Widget Text (ze Scrollbar)
text = Text(root, height=60, width=77)
scroll = Scrollbar(root, command=text.yview)
text.configure(yscrollcommand=sc roll.set)
text.tag_configure(’bold_italics’, font=(’Verdana’, 20,
’bold’, ’italic’))
text.tag_configure(’big’,
font=(’Verdana’, 24, ’bold’))
text.tag_configure(’color’,
foreground=’blue’, font=(’Tempus Sans ITC’,18))
text.insert(END, u’Uwaga!!!
Najnowsze
wiadomo\u015bci!\n’)
Widget Text (ze Scrollbar)
Text-widget
>>> sometext = open('README.TXT').read()
>>> w = Text(root,relief=SUNKEN)
>>> w.insert("1.0",sometext)
Widget Canvas
canvas.create_line(100, 100, 200, 200)
canvas.create_oval(10,
10,300,300,width=2,fill=’yellow’)
canvas.create_arc(100, 200, 300, 100, fill=’green’)
canvas.create_rectangle(50, 200, 300, 300, width=5,
fill=’#8f8fff’)
photo=PhotoImage(file=’006.gif’)
canvas.create_image(50, 300, image=photo, anchor=NW)
widget = Label(canvas, text=u’Ko\u0142o’, fg=’white’,
bg=’black’)
widget.pack()
canvas.create_window(100, 100, window=widget)
canvas.create_text(100, 280,
text=u’Prostok\u0105t’)
Widget jako obiekt
class EntryField(Frame):
def __init__(self,parent,label,labelwidth=12):
◦ Frame.__init__(self,parent)
◦ self.value = StringVar(self)
◦ l = Label(self,text=label,anchor=W,width=labelwidth)
◦ l.pack(side=LEFT)
◦ e = Entry(self,textvariable=self.value)
◦ e.pack(side=RIGHT,fill=X,expand=True)
def get_value(self):
◦ return self.value.get()
Widget jako funkcja
def entryfield(parent,label,labelwidth=12,**packopts):
f = Frame(parent)
f.pack(**packopts)
l = Label(f, text=label, width=labelwidth)
l.pack(side=LEFT, anchor=W)
value = StringVar(f)
e = Entry(f, textvariable=value)
e.pack(side=RIGHT, fill=X, expand=True)
return lambda: value.get()
Zdarzenia
def button_press(which):
print "You pressed", which
Button(root,text="Go",
command=lambda:button_press('go'))
Button(root,text="Cancel",
command=lambda:button_press('cancel'))
from functools import *
def button_press(which):
print "You pressed", which
Button(root,text="Go",
command=partial(button_press,'go'))
Button(root,text="Cancel",
command=partial(button_press,'cancel'))
def button_press(which):
print "You pressed", which
class Pressed(object):
def __init__(self,name):
self.name = name
def __call__(self):
button_press(self.name)
Button(root,text="Go", command=Pressed('go'))
Button(root,text="Cancel", command=Pressed('cancel'))
Obiekt Event
char łańcuch jednoznakowy – kod klawisza (tylko dla zdarzeń klawiatury)
keysym łańcuch, który jest symboliczną nazwą klawisza (tylko dla zdarzeń klawiatury)
num numer przycisku (tylko dla zdarzeń myszy)
x,y pozycja myszy w pikselach
x_root y_root pozycja myszy w pikselach względem lewego górnego rogu ekranu
widget widget w którym pojawiło się zdarzenie w.bind(zdarzenie, nazwa_funkcji)
Specjalne klawisze –F1, F2, Left, Right, Up, Down (te cztery ostatnie to strzałki); Prior i Next (to PGUP i PGDOWN); BackSpace, Delete, End, Home, Insert, Print, Tab, Esc; Enter;
Caps_Lock, Num_Lock, Scroll_Lock, Alt, Ctrl, Shift
Normalne klawisze – mają oczywiście swoje nazwy np.: w, 1, lub +. <space> i <less>.
Nazwy klawiszy modyfikowane przez Alt czy Shift np: <Control-Q> i <Alt-Up>.
Button-1 Button-2 Button-3 Użytkownik wcisnął lewy, środkowy lub odpowiednio prawy przycisk myszy..
B1-Motion B2-Motion B3-Motion Użytkownik przesunął myszę po widgecie trzymając wciśnięty lewy, środkowy lub odpowiednio prawy przycisk myszy.
ButtonRelease-1 ButtonRelease-2 ButtonRelease-3 Użytkownik zwolnił lewy, środkowy lub odpowiednio prawy przycisk myszy.
Double-Button-1 Double-Button-2 Double-Button-3 Użytkownik podwójnie wcisnął lewy, środkowy lub odpowiednio prawy przycisk myszy.
Enter Użytkownik przesunął myszę tak, że mysza nasunęła się na widget.
Leave Tak jak Enter
Standardowe widgety – informational dialog
>>> from tkMessageBox import *
>>> showinfo("FYI","I am about to destroy your
computer")
Standardowe widgety – warning dialog
>>> from tkMessageBox import *
>>> showwarning("Warning","Operation Unsuccessful")
Standardowe widgety – error dialog
>>> from tkMessageBox import *
>>> showerror("Fatal Error","Everything is hosed!")
Standardowe widgety – yes/no dialog
>>> from tkMessageBox import *
>>> askyesno("Confirm","Are you sure you're ready?")
Zwraca True/False
Standardowe widgety – OK./Cancel dialog
>>> from tkMessageBox import *
>>> askokcancel("Confirm","About to run a loop")
Zwraca True/False
Standardowe widgety – Retry/Cancel dialog
>>> from tkMessageBox import *
>>> askretrycancle("Try Again","Not responding")
Zwraca True/False
Standardowe widgety – Entry dialog
>>> from tkSimpleDialog import *
>>> askinteger("The value","Enter a value")
Warianty:
askinteger()
askfloat()