Aplikacje okienkowe (2)

Transkrypt

Aplikacje okienkowe (2)
Kurs systemu Unix
Aplikacje okienkowe (2)
1
Co było?
• Tk – rozszerzenie języka Tcl
• Tkinter – interfejs Pythona do Tk (standardowo
rozprowadzany)
Kurs systemu Unix
2
A konkretnie?
• Ramki (jako pojemniki na kontrolki)
• Przyciski (zwykłe, radiowe oraz opcji)
Kurs systemu Unix
3
Plan na dzisiaj
• Suwaki oraz proste okienka edycyjne
• Geometria:
– Metoda pack
– Metoda grid
• Listbox-y (wybór jednego z wielu tekstów)
• Okienka dialogowe
• Menu
Kurs systemu Unix
4
Wczytywanie tekstu
• Klasa Entry opisuje kontrolkę służącą do wpisywania tekstu.
• Opcja textVariable = n oznacza, że tekst trafia do zmiennej
n.
• Opcja show ’*’ oznacza, że zamiast tekstu pojawiają się
gwiazdki.
Kurs systemu Unix
5
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
6
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
7
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
8
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
9
Uwaga!
Nie należy łączyć w jednym oknie metod pack oraz grid!
Kurs systemu Unix
10
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
11
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
12
Listy. Zadanie
• Chcemy utworzyć aplikację zawierającą
1. Listę nazw plików w bierzącej kartotece.
2. Okienko tekstowe, w którym będzie pojawiała się nazwa
wybranego pliku.
3. Dwa paski do przewijania tej listy.
• Składniki:
1. Listę tworzymy poleceniem: Listbox
2. Suwak tworzymy poleceniem: Scrollbar
• Jest to pierwsze podejście do okienkowego mc.
Kurs systemu Unix
13
Powiązanie Listboxa z paskiem przewijania
• Umieszczamy je w jednej ramce
ramka = Frame()
• Podczas tworzenia łączymy je ze sobą, jak poniżej
sb = Scrollbar(ramka,orient = VERTICAL)
lb = Listbox(ramka,yscrollcommand=sb.set)
sb.config(command=lb.yview)
• Oczywiście możliwa jest też opcja xscrollcommand.
Kurs systemu Unix
14
Rozwiązanie
#!/usr/local/bin/python
from Tkinter import *
import os
root = Tk()
# obsługa zdarzenia
def gfile(event):
W = event.widget
Zaznaczone = W.curselection()
NazwaPliku = W.get(Zaznaczone[0])
wybranyPlik.set(NazwaPliku)
#zmienne
wybranyPlik = StringVar()
Kurs systemu Unix
15
#kontrolki
L = Listbox()
H = Scrollbar(orient = "horizontal", command = L.xview)
V = Scrollbar(command = L.yview)
L.config(selectmode="single", width=20, height=10,
xscroll = H.set, yscroll=V.set)
Lab = Label(text= "File Selected:" , justify = ’left’)
E = Entry(textvariable = wybranyPlik)
L.grid(row=0, column=0, columnspan=2, sticky="news")
V.grid( row=0, column=2, sticky="ns")
H.grid( row=1, column=0, columnspan=2, sticky="we")
Lab.grid( row=2, column=0)
E.grid( row=3, column=0,
columnspan=3, sticky= "we")
Kurs systemu Unix
16
L.bind("<ButtonRelease-1>",gfile)
for p in os.listdir("/home/pamarzka/"):
L.insert(END,p)
mainloop()
Kurs systemu Unix
# tu się zaczyna działanie
17
Co to jest focus?
• Focus to zdolność kontrolki do przyjmowania danych z
klawiatury.
• Kontrolka, która go ma reaguje na różne klawisze: PAGE UP,
PAGE DOWN (listoboxy) oraz spację (przyciski).
• Ma go jedna kontrolka, wyróżniona ramką
• Przełączają go klawisze TAB oraz (w drugą stronę) kombinacja
SHIFT+TAB. Przez kontrolkę tekstową można przeskoczyć
używając CTR+TAB
• Można wyłączyć z kolejki focusowej kontrolkę za pomocą opcji
takefocus, pisząc K.configure(takefocus = 0)
• Domyślnie nie podąża za myszką, ale można użyć opcji
tk_focusFollowsMouse.
Kurs systemu Unix
18
Reagowanie na klawisze
• Nie jesteśmy zadowoleni z domyślnej reakcji na przesuwanie:
nie przesuwa się zaznaczenie, tylko kreska.
• Zmieniamy obsługę klawiszy:
lb.bind("<KeyPress>",keymoves)
• dodajemy obsługę przesuwania:
def keymoves(event):
lb = event.widget
key = event.keysym
poz = int(lb.curselection()[0])
lb.select_clear(poz)
if key == "Up" and poz > 0: poz = poz-1
if key == "Down" and poz < lb.size()-1: poz=poz+1
lb.select_set(poz)
Kurs systemu Unix
19
Sposoby wybierania
• Listy mają parametr selectmode.
• Wartość SINGLE oznacza wybór pojedynczego elementu.
• Domślna wartość BROWSE podobnie, ale można używać myszki.
• Wybór większej liczby realizujemy za pomocą EXTENDED.
Kurs systemu Unix
20
Okienka dialogowe: komunikaty
• Okienka komunikatów zawarte są w module: tkMessageBox.
• Przykładowe wywołania:
tkMessageBox.showwarning("Otwieranie pliku","Nie da się!\n")
if tkMessageBox.askyesno("Drukowanie", "Chcesz drukować?"):
print "No to piszemy!"
• W okienkach informacyjnych można jeszcze używać showinfo
oraz showerror, różnią się od showwarning rodzajem ikonki.
• W pytaniach można używać również
askokcancel,askretryignore
Kurs systemu Unix
21
Opcje okienek komunikatowych
• icon – ikona wyświetlana, np ERROR, INFO, QUESTION lub
WARNING (może też byc obiekt obrazka)
• default – który z klawiszy będzie domyślnie ustawiony
(ABORT, OK, ...)
Kurs systemu Unix
22
Inne proste okienka
• Zdefiniowane w module tkSimpleDialog
• Służą do wczytywania tekstu, liczby całkowitej względnie liczby
zmiennopozycyjnej.
• Wczytanie napisu realizujemy za pomocą:
tkSimpleDialog.askstring(title, prompt,
initialvalue = ’Na początku’)
• Podajemy tytuł okna i tekst nad okienkiem wczytującym.
Można (ale nie trzeba) podać początkową wartość tekstu.
• Są też funkcje askinteger oraz askfloat.
Kurs systemu Unix
23
Dialogi związane z plikami
• Trzeba zaimportować tkFileDialog.
• Do otwierania pliku służy funkcja
tkFileDialog.askopenfilename() która wywołuje
„standardową” przeglądarkę dla plików i zwraca nazwę
wyznanego pliku.
• Do nazwy zapisywanego pliku służy asksavefilename
Kurs systemu Unix
24
Wybór koloru
• Dialog znajduje się w module tkColorChooser
• Funkcja: askcolor zwraca trzyelementową krotkę, będącą
opisem koloru w RGB.
Kurs systemu Unix
25
Menu
• Mamy trzy podstawowe metody: add_command, add_cascade,
add_separator dodające odpowiednio: 1 element w menu,
podmenu oraz separator (czyli kreskę)
• Podmenu jest innym obiektem typu Menu.
• Z pozycjami w menu łączymy funkcje bezargumentowe
oznaczające akcję wybraną przez daną pozycję z menu.
Kurs systemu Unix
26
Menu: przykład
from Tkinter import *
def callback(): print "called the callback!"
root = Tk()
menu = Menu(root)
root.config(menu=menu) # nazwa-par = obiekt
filemenu = Menu(menu)
menu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="New", command=callback)
filemenu.add_command(label="Open", command=callback)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=callback)
Kurs systemu Unix
27
helpmenu = Menu(menu)
menu.add_cascade(label="Help", menu=helpmenu)
helpmenu.add_command(label="About", command=callback)
mainloop()
Kurs systemu Unix
28

Podobne dokumenty