Aplikacje okienkowe (2) urs systemu Unix 1
Co było? Tk rozszerzenie języka Tcl Tkinter interfejs Pythona do Tk (standardowo rozprowadzany) urs systemu Unix 2
A konkretnie? Ramki (jako pojemniki na kontrolki) Przyciski (zwykłe, radiowe oraz opcji) urs 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 urs 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. urs 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. urs 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. urs 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. urs 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. urs systemu Unix 9
Uwaga! Nie należy łączyć w jednym oknie metod pack oraz grid! urs 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. urs 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 urs 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. urs 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. urs 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() urs 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") urs systemu Unix 16
L.bind("<ButtonRelease-1>",gfile) for p in os.listdir("/home/pamarzka/"): L.insert(END,p) mainloop() # tu się zaczyna działanie urs systemu Unix 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. urs 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) urs 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. urs 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 urs 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,...) urs 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. urs 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 urs systemu Unix 24
Wybór koloru Dialog znajduje się w module tkcolorchooser Funkcja: askcolor zwraca trzyelementową krotkę, będącą opisem koloru w RGB. urs 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. urs 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) urs systemu Unix 27
helpmenu = Menu(menu) menu.add_cascade(label="help", menu=helpmenu) helpmenu.add_command(label="about", command=callback) mainloop() urs systemu Unix 28