• Nie Znaleziono Wyników

Wykład 4: GUI Widget.

N/A
N/A
Protected

Academic year: 2021

Share "Wykład 4: GUI Widget."

Copied!
57
0
0

Pełen tekst

(1)

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 ry­sowania grafów i wykresów i tworzenia graficznych edy­toró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ży­wane do grupowania widgetów

Label Wyświetla tekst lub obraz

Listbox Wyświetla listę do wyboru. Ta lista może być skonfi­gurowana 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

(2)

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)

(3)

Tkinter na skróty

 Krótki przykład:

>>> from Tkinter import Label

>>> x = Label(None,text="Hello World")

>>> x.pack()

>>> x.mainloop()

 Wyjście:

(4)

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!

 …

(5)

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ń

(6)

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()

(7)

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

(8)

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'

>>>

(9)

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)

(10)

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'

(11)

Widgety jako blok

(12)

Geometrie Tkintera

Geometria Opis

Grid Geometria grid pozwala organizować widgety w 2-wymia­rowej 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ąd­nymi pozycji, aby ją stosować używamy metody place.

(13)

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.

(14)

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)

(15)

Geometria pack - side

w.pack(side=TOP) w.pack(side=LEFT)

w.pack(side=BOTTOM) w.pack(side=RIGHT)

(16)

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

(17)

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()

(18)

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ł.

(19)

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)

(20)

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)

(21)

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)

(22)

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ł.

(23)

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.

(24)

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 wy­stę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.

(25)

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()

(26)

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

(27)

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,

(28)

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ść.

(29)

Widget Toplevel

root = Tk()

t1 = Toplevel(root)

t2 = Toplevel(root)

t2.transient(root)

t3 = Toplevel(root, borderwidth=5, bg=’blue’)

t3.overrideredirect(1)

(30)

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()

(31)

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)

(32)

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)

(33)

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”

(34)

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()

(35)

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) ...

>>>

(36)

Widget Scale

self.control = Scale( self, from_ = 0, to = 200,

orient = HORIZONTAL, command=self.updateCircle)

self.control.pack( side = BOTTOM, fill = X )

(37)

Widget Scrollbar

 Scrollbar

>>> w =

Scrollbar(root,orient="vertical")

(38)

Widget Menu: CommandMenu,

CascadeMenu, CheckbuttonMenu,

RadiobuttonMenu, DisabledMenu

(39)

Widget Message

Message(root, text=u"P… ”, bg=’yellow’,

fg=’#0537FF’,relief=GROOVE).pack(padx=10, pady=10)

(40)

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’)

(41)

Widget Text (ze Scrollbar)

 Text-widget

>>> sometext = open('README.TXT').read()

>>> w = Text(root,relief=SUNKEN)

>>> w.insert("1.0",sometext)

(42)

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’)

(43)

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()

(44)

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()

(45)

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'))

(46)

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 widge­cie trzymając wciśnięty lewy, środkowy lub odpowiednio prawy przycisk myszy.

ButtonRelease-1 ButtonRelease-2 ButtonRelease-3 Użytkownik zwol­nił lewy, środkowy lub odpowiednio prawy przycisk myszy.

Double-Button-1 Double-Button-2 Double-Button-3 Użytkownik po­dwó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

(47)

Standardowe widgety – informational dialog

>>> from tkMessageBox import *

>>> showinfo("FYI","I am about to destroy your

computer")

(48)

Standardowe widgety – warning dialog

>>> from tkMessageBox import *

>>> showwarning("Warning","Operation Unsuccessful")

(49)

Standardowe widgety – error dialog

>>> from tkMessageBox import *

>>> showerror("Fatal Error","Everything is hosed!")

(50)

Standardowe widgety – yes/no dialog

>>> from tkMessageBox import *

>>> askyesno("Confirm","Are you sure you're ready?")

Zwraca True/False

(51)

Standardowe widgety – OK./Cancel dialog

>>> from tkMessageBox import *

>>> askokcancel("Confirm","About to run a loop")

Zwraca True/False

(52)

Standardowe widgety – Retry/Cancel dialog

>>> from tkMessageBox import *

>>> askretrycancle("Try Again","Not responding")

Zwraca True/False

(53)

Standardowe widgety – Entry dialog

>>> from tkSimpleDialog import *

>>> askinteger("The value","Enter a value")

Warianty:

askinteger()

askfloat()

askstring()

(54)

Standardowe widgety – Filename dialog

>>> from tkFileDialog import *

>>> askopenfilename()

 'C:/Python25/README.txt'

 >>>

(55)

Standardowe widgety – Directory dialog

>>> from tkFileDialog import *

>>> askdirectory()

 'C:/Python25/Doc'

 >>>

(56)

Standardowe widgety – Save As dialog

>>> from tkFileDialog import *

>>> asksaveasfilename()

(57)

Standardowe widgety – Color Choose dialog

>>> from tkColorChooser import *

>>> askcolor()

 ((0,0,255),'#0000ff')

 >>>

Cytaty

Powiązane dokumenty

Zbiór M reprezentuje zbiór metod należących do wszystkich klas, zbiór A reprezentuje zbiór atrybutów wszystkich klas, natomiast R jest zbiorem krawędzi, które

Zbiór M reprezentuje zbiór metod naleŜących do wszystkich klas, zbiór A reprezentuje zbiór atrybutów wszystkich klas, natomiast R jest zbiorem krawędzi, które

One is to facilitate advances in mining clinical free text; shared tasks in other biomedical domains have been shown to drive progress in the field in multiple ways (see [Hirschman

Anna Ptaszek Wartość stałej szybkości reakcji k nie zależy od stężenia reagentów ale

wybranych baz danych 6 baz danych.. Wykaz obiektów stanowiących treść mapy zasadniczej jest określony w załączniku nr 5 do rozporządzenia. Specyfikacja pojęciowego

komponent powiązany jest ze słuchaczem, który jest obiektem implementującym okresloną metodę... Rodzaje interfejsów obserwatorów ActionListener –

After pushing the button change text in first label to I’ve pressed button XX and change background color of label.. Add to panel third button of type

• ochrona autentyczności obrazu (ukryty obraz pełni rolę znaku wodnego (watermark)), w tym przypadku konieczną własnością obrazu ukrytego jest (poza odpornością na