Aplikacje okienkowe
Transkrypt
Aplikacje okienkowe
Aplikacje okienkowe
Kurs systemu Unix
1
Najpopularniejsze biblioteki systemu X
• Tk rozszerzenie j¦zyka Tcl
• GTK biblioteka u»ywana w GNOME (pierwotnie w Gimp)
• Qt biblioteka u»ywana w KDE
• wxWindows opakowuje oryginalne kontrolki
• Wszystkie s¡ w znacznym stopniu przeno±ne (Windows,
MacOS)
• Dawniej byªa jeszcze komercyjna biblioteka Moti
• Umo»liwiaj¡ pisanie programów w C, C++, Pythonie, Perlu
oraz w Tcl
Kurs systemu Unix
2
Pakiet narz¦dziowy Tk
• Interfejs do niego standardowo doª¡czany do dystybucji
Pythona jako moduª Tkinter
• Najcz¦±ciej ªadowany za pomoc¡ from Tkinter import *.
• Wygl¡d odrobink¦ maªo trendy.
• Mo»liwe rozszerzenie: tix, moduª zawieraj¡cy dodatkowe
kontrolki.
Kurs systemu Unix
3
Inne mo»liwo±ci w Pythonie
• PyGTK wersja GTK dla Pythona
• PyQt wersja Qt dla Pythona
• wxPython wersja wxWindows dla Pythona
wxPython is the best and most mature cross-platform
GUI toolkit, given a number of constraints. The only
reason wxPython isn't the standard Python GUI toolkit is
that Tkinter was there rst. Guido van Rossum
Kurs systemu Unix
4
Tcl/Tk a Tkinter
• Pisz¡c programy w Tkinter, cz¦sto si¦gamy do dokumentacji
Tcl/Tk
• Cho¢ Tcl jest zupeªnie innym j¦zykiem ni» Python, wiele rzeczy
w Tkinter da si¦ ªatwo wydedukowa¢, przygl¡daj¡c si¦
konstrukcjom Tcl/Tk
Kurs systemu Unix
5
Podstawy Tcl/Tk
• Interpreterem Tcl/Tk jest program wish.
• Gdy chcemy by wish przeczytaª co± z pliku to u»ywamy opcji
-f.
• Po uruchomieniu wish otwiera si¦ okienko aplikacji, mo»emy
korzysta¢ z konsoli i z niej wprowadza¢ polecenia zmieniajace
sytuacj¦ w okienku aplikacji.
Kurs systemu Unix
6
Witaj ±wiecie!
#!/usr/local/bin/wish -f
pack [button .b -text "Witaj\n±wiecie!" \
-justify center \
-width 20 \
-command {puts "Cze±¢!"} ]
Kurs systemu Unix
7
Komentarz do przykªadu
• Polecenie button tworzy przycisk o nazwie .b i o pewnych
wªa±ciwo±ciach (-text, ...)
• Polecenie pack umieszcza kontrolk¦ w oknie aplikacji.
• Nazwy kontrolek oddaj¡ ich hierarchi¦: .a.b.c oznacza, »e
kontrolka a jest na najwy»szym poziomie, jest ona ojcem b,
który z kolei jest ojcem c.
• Mo»na zmienia¢ warto±ci pól istniej¡cych kontrolek za pomoc¡
polecenia configure, pisz¡c przykªadowo:
.b config -text "Dzie« dobry!"
Kurs systemu Unix
8
Witaj ±wiecie (w Pythonie)
from Tkinter import *
root = Tk() # gdyby byª nam potrzebny
# obiekt gªównego okna
def callback(): print "Cze±¢ tu Python"
b = Button(text="Witaj ±wiecie", width=20, justify
= "center", command=callback)
b.pack()
mainloop()
Kurs systemu Unix
# tu si¦ zaczyna dziaªanie
# zdeterminowane interfejsem
9
Ogólne zasady translacji Tcl/Tk -> Python
• Nazwy z tcl/tk typu .appl.ramka.przyciskWRamce zas?¡pione
s¡ normalnymi nazwami obiektów Pythona.
• Poleceniu button tworz¡cemu przycisk odpowiada klasa
Button, oczywi±cie Button(...) jako konstruktor jest te»
poleceniem tworz¡cym przycisk.
• Czyli:
button .fred
button .panel.fred
.fred configure -fg red
=====>
=====>
=====>
ALBO=>
fred = Button()
fred = Button(panel)
fred["fg"] = red
fred.config(fg = "red")
• Wywoªanie polecenia dla kontrolki tªumaczy si¦ na wywoªanie
metody dla obiektu kontrolki.
Kurs systemu Unix
10
Tk i Python (2)
• Pewne opcje Tk przyjmuj¡ warto±ci ze sko«czonego zbioru.
• Realizowane jest to za pomoc¡ napisów.
• Opcje boolowskie wymagaj¡ staªych 0 oraz 1, wzgl¦dnie
napisów 'yes' albo 'no'.
• Opis polece« Tk jest (najprawdopodobniej) dost¦pny za
po±rednictwem systemowego podr¦cznika, przykªadowo man
pack albo man grid.
Kurs systemu Unix
11
Zmienne Tk
• Kontrolki cz¦sto maj¡ zwi¡zan¡ ze sob¡ zmienn¡ do
przekazywania warto±ci wczytywanych przez kontrolk¦.
• Zmienne mog¡ by¢ dzielone przez kilka kontrolek. Naturalne
takie sytuacje to: przyciski Radiobuttons albo para
suwak+maªe okienko edycyjne.
• Kontrolka musi mie¢ prawo zmieniania warto±ci zmiennej, a
zatem nawet je±li zmienna jest Int to powinna by¢ obiektem
zmiennym
• Tkinter deniuje klasy (dziedzicz¡ce z Variable): StringVar,
IntVar, DoubleVar oraz BooleanVar
• Zmiana i odczytywanie warto±ci tych obiektów powinna by¢
wykonywana metodami set oraz get.
• Mo»na zdeniowa¢ wªasn¡ klas¦ dziedzicz¡c¡ z Variable.
Kurs systemu Unix
12
Co mog¡ kontrolki?
• Poniewa» kontrolkom odpowiadaj¡ klasy Pythona, mo»na
wywoªa¢ dir(NazwaKlasyKontrolki), aby dowiedzie¢ si¦, co
ma ona do zaoferowania.
• Program
>>> L = dir(Listbox)
len(L)
da w wyniku pora»aj¡c¡ liczb¦ 206.
• Pami¦tamy równie» o atrybucie __doc__, przykªadowo
Listbox.__doc__ oznacza napis: 'Listbox widget which
can display a list of strings.'
• O konkretnym atrybucie mo»emy si¦ dowiedzie¢ pisz¡c:
print Listbox.pack.__doc__
Kurs systemu Unix
13
O klasach kontrolek ogólnie
• Kontrolki dziedzicz¡ z klasy Widget (180 elementów).
• Kontrolki maj¡ metody oraz opcje (razem 206, dla Listbox).
• Opcje okre±laj¡ zachowanie i wygl¡d kontrolki.
• Opcje ustala si¦ podczas wykonanie kostruktora oraz za
pomoc¡ metody configure (alternatywn¡ form¡ jest
przeci¡»ony operator indeksowania)
• Pierwszym parametrem kontruktora jest okno macierzyste
(domy±lnie gªówne okno aplikacji), nast¦pne parametrzy
podajemy zwykle za pomoc¡ sªów kluczowych.
• Równie» za pomoc¡ sªów kluczowych podajemy parametry
configure.
Kurs systemu Unix
14
Ramki
• Klasa Frame opisuje ramk¦ (pojemnik na inne rzeczy).
• Opcja relief deniuje styl obramowania, opcja bg z
argumentem n mówi, »e obramowanie ma mie¢ n pikseli
dªugo±ci.
• W nast¦pnym przykªadzie u»ywane s¡ nast¦puj¡ce opcje
polecenia pack:
1) side z argumentem left (z której strony)
2) padx, pady z argumentem liczbowym, mówi¡ce o wielko±ci
odst¦pu (domy±lnie przyklejamy, czyli odst¦p 0)
Kurs systemu Unix
15
Przykªad z ramkami
#!/usr/bin/python
from Tkinter import *
root = Tk()
root["bg"] = "steelblue"
F = []
for r in [ 'sunken', 'raised', 'flat', 'ridge', 'groove']:
F.append( Frame( width="0.5i", height="0.5i", relief=r, bd= 2))
for fr in F:
fr.pack(side="top", padx=10, pady=10)
mainloop()
Kurs systemu Unix
16
Etykieta
• Etykieta to nieaktywny tekst o pewnych parametrach.
• Odpowiada jej klasa Label
• Przykªadowe opcje:
1. Podstawowa text mówi o tre±ci etykiety.
2. Opcja justify, z argumentem 'left', 'right', 'center'
mówi o formatowaniu tekstu
3. wraplength mówi o szeroko±ci tekstu (domy±lnie w
pikselach, ale mo»liwe inne jednostki)
Kurs systemu Unix
17
Przyciski
• Mamy trzy rodzaje przycisków: zwykªe, pola wyboru oraz pola
opcji.
• Odpowiadaj¡ im klasy: Button, Radiobutton oraz
Checkbutton.
• Niektóre opcje:
1. Opcja variable mówi o zmiennej przechowywuj¡cej wynik
przycisku.
2. Opcje onvalue oraz -offvalue dla checkbox-ów mówi o
warto±ci tej zmiennej, w odpowiednim przypadku
3. Opcja value dla pól opcji ma analogiczn¡ funkcj¦.
Kurs systemu Unix
18
Troch¦ wi¦kszy program (przykªad)
• Wybór jednej z trzech opcji
• aktywny jedynie wówczas, gdy wª¡czony przycisk typu
checkbutton
• i do tego dwa przyciski
1. mówi¡cy o stanie wczytywania
2. ko«cz¡cy dziaªanie programu
Kurs systemu Unix
19
Troch¦ wi¦kszy program
• Na pocz¡tku tworzymy zmienne
from Tkinter import *
glodny = BooleanVar(); glodny.set(1)
danie = StringVar(); danie.set('mielonka')
• oraz przyciski do wyboru opcji
RB = []; dania = ['mielonka','jajecznica','d»em']
for i in range(len(dania)):
RB.append( Radiobutton(text = dania[i], value = dania[i],
justify="left", variable = danie))
Kurs systemu Unix
20
Troch¦ wi¦kszy program (2)
• Funkcja dla przycisku opcji
def zglodnialem():
if glodny.get():
for i in range(3): RB[i].configure(state = "normal")
else
for i in range(3): RB[i].configure(state = "disabled")
• oraz sam przycisk opcji
cb = Checkbutton( text = "Jeste± gªodny", command=zglodnialem,
relief = "flat"
variable = glodny, onvalue=1, offvalue= 0)
Kurs systemu Unix
21
Troch¦ wi¦kszy program (3)
• Do sterowania aplikacj¡ sªu»¡ dwa przyciski
show = Button(text = "Poka» warto±ci", command = pokazZmienne)
koniec = Button(text = "Koniec", command = root.quit)
• Obsªuga przycisku Poka» zmienne
def pokazZmienne():
if not glodny.get():
print "Nie jestes glodny!"
else
print "Masz ochot¦ na " + danie.get()
Kurs systemu Unix
22
Troch¦ wi¦kszy program (4)
• Ustawienie na ekranie tego wszystkiego (w prostok¡tnej siatce)
cb.grid( .lan -row 1 -column 0 -sticky "w"
RB[0].grid(row=0, column=1, sticky= "w")
RB[1].grid(row=1, column=1, sticky= "w")
RB[2].grid(row=2, column=1, sticky= "w")
show.grid(row=3, column=0, sticky= "w"
koniec.grid(row 3, column= 1, sticky= "w"
• Zostaªo jeszcze uruchomi¢ mainloop()
Kurs systemu Unix
23
Wczytywanie tekstu
• Klasa Entry opisuje kontrolk¦ sªu»¡c¡ do wpisywania tekstu.
• Opcja textVariable = n oznacza, »e tekst traa do zmiennej
n.
• Opcja show '*' oznacza, »e zamiast tekstu pojawiaj¡ si¦
gwiazdki.
Kurs systemu Unix
24
Suwak
• Za pomoc¡ suwaka wczytujemy liczb¦ caªkowit¡.
• Suwak opisuje klasa Scale, ma on opcje:
orient, orientacja, np. 'horizontal'
_from oraz to, zasi¦g liczby
tickinterval ja cz¦sto podziaªka
variable zmienna.
length dªugo±¢
• Mo»na poª¡czy¢ suwak z polem edycyjnym za pomoc¡ tej
samej zmiennej.
Kurs systemu Unix
25
Geometria
• U»ywa si¦ nast¦puj¡cych jednostek: m, c, i, p oznaczaj¡cych,
odpowiednio: milimetry, centymetry, cale, punkty ekranowe.
• W opcjach wymagaj¡cych argumentu b¦d¡cego dªugo±ci¡,
nale»y po liczbie wypisa¢ jej miano, np length = '3i'.
Kurs systemu Unix
26
Metoda pack
• Umieszcza kontrolki poczynaj¡c od kraw¦dzi okna/kontrolki
nadrz¦dnej.
• Ka»da kontrolka wie, która kontrolka jest dla niej nadrz¦dna.
• U»ywali±my opcji padx, pady. Opcje ipadx, ipady sprawiaj¡
»e kontrolka si¦ rozszerza i puchnie tak, by przerwa byªa
minimalna.
Kurs systemu Unix
27
Metoda grid
• Polecenie grid sªu»y do tworzenia tabel i rozmieszczania
ró»nych rzeczy w prostok¡tnej siatce.
• Kontrolk¦ umieszcza si¦ w podrz¦dnym oknie, poªo»enie
okre±laj¡ opcje row oraz column.
• Mo»na rozci¡gn¡¢ obszar kontrolki za pomoc¡ rowspan n oraz
columnspan
• W ramach przydzielonego obszaru mo»na rozci¡gac kontolk¦ za
pomoc¡ opcji sticky. Przykªadowo sticky e zakotwicza
konrolk¦ po prawej stronie, sticky ew sprawia, »e mo»e si¦ ona
rozci¡gac ze wschodu na zachód.
Kurs systemu Unix
28
Uwaga!
Nie nale»y ª¡czy¢ w jednym oknie metod pack oraz grid!
Kurs systemu Unix
29
Powi¡zania
• Metoda bind ª¡czy zdarzenie z kontrolk¡ i poleceniem.
• Zawiera dwa argumenty: napis opisuj¡cy zdarzenie oraz funkcj¦
obsªuguj¡c¡ zdarzenie.
• Ta funkcja powinna bra¢ argument typu Event z niego da si¦
odczyta¢ ró»ne informacje dotycz¡ce zdarzenia.
• Przykªadowe nazwy zdarze«
<KeyPress-Left>, <Control-Button-1>, <Alt-Button-2>,
<ButtonRelease-1>, <Enter>, <Double-Button-2>
<KeyPress-Right>, <Alt-KeyPress-Space>
...
• Wi¦cej przykªadów mo»na uzyskac pisz¡c man bind (cho¢ pod
t¡ nazw¡ mo»e by¢ polecenie basha) lub man event.
Kurs systemu Unix
30
Zdarzenia
Zdarzenie (typ event) ma takie mi¦dzy innymi atrybuty:
• x,y,x_root,y_root wspóªrz¦dne zdarzenia (we
wspóªrz¦dnych okna zdarzenia lub okna gªównego)
• widget kontrolka, której zdarzenie dotyczy
• keysym nazwa klawisza, na przykªad 'left'
• time czas zdarzenia
Kurs systemu Unix
31