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