rozdział 4: WŁASNOŚCI WIDŻETÓW ostatnia modyfikacja: 14.04.19
Odczytywanie i ustawianie własności widżetów
Metoda słownikowa : jeżeli widżet Wi ma własność o nazwie prop, to: jeśli chcemy odczytać tę własność, używamy zapisu: val = Wi["prop"] jeśli chcemy ustawić tę własność, używamy zapisu: Wi["prop"] = val uwaga: wartość własności jest zawsze napisem!
Prosty przykład z widżetem Button i własnością text: from tkinter import * def włwył(): global b stan = b["text"] if stan == "Wyłączony": stan = "Włączony" else: stan = "Wyłączony" b["text"] = stan o = Tk( ) b = Button(o,text="Wyłączony",command=włwył) b.place(x=50,y=100) o.mainloop() 04_01.py
Metoda metodowa : jeżeli widżet Wi ma własność o nazwie prop, to: jeśli chcemy odczytać tę własność, używamy metody cget(): val = Wi.cget("prop") jeśli chcemy ustawić tę własność, używamy metody config(): Wi.config(prop = val) uwaga: tutaj wartość własności również jest zawsze napisem!
Prosty przykład z widżetem Button i własnością text: from tkinter import * def włwył(): global b stan = b.cget("text") if stan == "Wyłączony": stan = "Włączony" else: stan = "Wyłączony" b.config(text = stan) o = Tk( ) b = Button(o,text="Wyłączony",command=włwył) b.place(x=50,y=100) o.mainloop() 04_02.py
Czcionki
Opisywanie czcionki: jeżeli pewien widżet ma własność font, to zmiana fontu domyślnego dokonuje się poprzez użycie tzw. krotki (ang. tuple) krotka to niemutowalny zbiór wartości różnych typów, zapisywany w nawiasach okrągłych, z wartościamy rozdzielanymi przecinkami np. to jest krotka z trzema elementami: (1, 2.3, "4") font opisujemy na dwa sposoby: krotką dwuelementową postaci ("family", "size") ("Times", "24") krotką trójelementową postaci ("family", "size", "style") ("Arial", "12", "bold") uwaga: rozmiar (size) zawsze wyrażonych w punktach! możliwe wartości style: bold, italic, underline, overstrike
Prosty przykład z widżetami Button: from tkinter import * o = Tk( ) b1=button(o,text="zażółć gęślą jaźń") b1.grid(column=0,row=0) b2=button(o,text="zażółć gęślą jaźń",font=("times","12")) b2.grid(column=0,row=1) b3=button(o,text="zażółć gęślą jaźń",font=("arial","16","bold")) b3.grid(column=0,row=2) o.mainloop() 04_03.py
Wybrane standardowe własności widżetów: rozmiary (zwykle wyrażane w pikselach, ale czasem w wierszach tekstu)
nazwa nazwa własności własności borderwidht highlightthickness padx padx pady pady selectborderwidth wraplength height height opis opis szerokość szerokość trójwymiarowej ramki ramki otaczającej otaczającej widżet widżet szerokość szerokość ramki ramki rysowanej rysowanej dokoła dokoła widżetu widżetu w celu celu uwidocznienia jego jego skupienia skupienia dodatkowy dodatkowy margines margines wkoło wkoło zawartości zawartości widżetu widżetu (w (w dwóch dwóch kierunkach) kierunkach) jak jak borderwidth, borderwidth, ale ale wtedy, wtedy, gdy gdy widżet widżet jest jest wybrany wybrany maksymalna maksymalna długość długość tekstu tekstu wewnątrz wewnątrz widżetu, widżetu, który który wyzwala wyzwala zawinięcie zawinięcie tekstu tekstu wysokość wysokość widżetu widżetu underline indeks indeks tego tego znaku znaku w tekście tekście widżetu, widżetu, który który ma ma być być podkreślony lub lub -1-1 width width szerokość szerokość widżetu widżetu
Prosty przykład z widżetami Button: from tkinter import * o = Tk( ) b1 = Button(o, text="zwykły przycisk"); b1.pack() b2 = Button(o, text="wyjątkowy przycisk") b2.pack() b2["borderwidth"] = 5 b2["highlightthickness"] = 5 b2["padx"] = 10 b2["pady"] = 15 b2["underline"] = 0 o.mainloop() 04_04.py
Wybrane standardowe własności widżetów: kolory (wyrażane w sposób już omówiony)
nazwa nazwa własności własności background bg bg foreground fg fg activeforeground activebackground selectforeground selectbackground highlightbackground highlightcolor disabledforeground opis opis kolor kolor tła tła widżetu widżetu kolor kolor pierwszego pierwszego planu planu widżetu widżetu (może (może oznaczać oznaczać różne różne rzeczy rzeczy w różnych różnych widżetach) widżetach) kolory kolory widżetu widżetu aktywnego aktywnego kolory kolory widżetu widżetu wybranego wybranego kolory kolory widżetu widżetu posiadającego skupienie skupienie kolor kolor pierwszego pierwszego planu planu widżetu, widżetu, który który jest jest zdezaktywowany
Prosty przykład z widżetami Button: from tkinter import * o = Tk( ) b1 = Button(o, text="zwykły przycisk"); b1.pack() b2 = Button(o, text="wyjątkowy przycisk") b2.pack() b2["bg"] = "#000000" b2["fg"] = "yellow" b2["activeforeground"] = "#000000" b2["activebackground"] = "yellow" b2["underline"] = 0 o.mainloop() 04_05.py
Wybrane standardowe własności widżetów: czcionki (to już znamy )
Wybrane standardowe własności widżetów: kotwice (sposób ulokowania tekstu we wnętrzu widżetu)
nazwa nazwa własności własności anchor anchor opis opis miejsce miejsce zakotwiczenia tekstu tekstu we we wnętrzu wnętrzu widżetu widżetu (domyślnie (domyślnie CENTER) CENTER) NW NW N NE NE W CENTER E SW SW S SE SE
Prosty przykład z widżetami Button: from tkinter import * o = Tk( ) b1 = Button(o, text="zwykły przycisk"); b1["anchor"] = E b1["width"] = 20 # w pikselach b1.pack() b2 = Button(o, text="wyjątkowy przycisk") b2["anchor"] = SE b2["width"] = 20 b2["height"] = 3 # w wierszach b2.pack() o.mainloop() 04_06.py
Wybrane standardowe własności widżetów: reliefy (sposób symulowania trójwymiarowości)
nazwa nazwa własności własności FLAT FLAT RAISED RAISED SUNKEN SUNKEN GROOVE GROOVE RIDGE RIDGE opis opis płaski płaski uniesiony uniesiony zapadnięty zapadnięty wyżłobiony wyżłobiony prążkowany prążkowany
Prosty przykład z widżetami Button: from tkinter import * o = Tk( ) Button(o,text="FLAT", relief=flat ).pack() Button(o,text="RAISED", relief=raised ).pack() Button(o,text="SUNKEN", relief=sunken ).pack() Button(o,text="GROOVE", relief=groove ).pack() Button(o,text="RIDGE", relief=ridge ).pack() o.mainloop() 04_07.py
Wybrane standardowe własności widżetów: bitmapy (standardowe ikony nanoszone na powierzchnię widżetu)
nazwa nazwa własności własności bitmap bitmap opis opis nazwa nazwa standardowej ikonki ikonki informacyjnej nazwa nazwa ikonki ikonki "error" "error" "hourglass" "info" "info" "questhead" "question" "warning" znaczenie znaczenie błąd błąd klepsydra informacja pytajnikowa głowa głowa pytanie ostrzeżenie
Prosty przykład z widżetami Button: from tkinter import * o = Tk( ) Button(o,bitmap="error").pack() Button(o,bitmap="hourglass").pack() Button(o,bitmap="info").pack() Button(o,bitmap="questhead").pack() Button(o,bitmap="question").pack() Button(o,bitmap="warning").pack() o.mainloop() 04_08.py
Wybrane standardowe własności widżetów: kursory (wygląd kursora myszy uwidaczniany nad widżetem)
nazwa nazwa własności własności cursor cursor opis opis nazwa nazwa standardowego kursora kursora nazwa nazwa ikonki ikonki "arrow" "arrow" "clock" "clock" "cross" "cross" "heart" "heart" znaczenie znaczenie strzałka strzałka zegarek krzyżyk serduszko Pełny spis nazw dostępnych kursorów jest dostępny pod adresem: https://www.tcl.tk/man/tcl8.4/tkcmd/cursors.htm
Prosty przykład z widżetami Button: from tkinter import * o = Tk( ) Button(o,text="arrow",cursor="arrow").pack() Button(o,text="clock",cursor="clock").pack() Button(o,text="heart",cursor="heart").pack() o.mainloop() 04_09.py
Wybrane standardowe metody widżetów (inne niż już omówione)
Zakładamy, że w jest istniejącym widżetem: nazwa nazwa metody metody w.after(czas_ms,fun) w.after_cancel(id) w.bell() działanie działanie Funkcja Funkcja fun fun zostanie zostanie wywołana wywołana jednokrotnie jednokrotnie po po upływie upływie czasu czasu czas_ms; czas_ms; czas czas wyrażany wyrażany jest jest w milisekundach (1s (1s = = 1000ms); 1000ms); wynikiem wynikiem jest jest identyfikator, identyfikator, który który może może być być użyty użyty przez przez after_cancel() Wyłączenie funkcji przypisane przez przez w.after() Zrób Zrób trochę hałasu
from tkinter import * def mryg(): global f,biały if biały: kol='black' else: kol='white' biały = not biały f.config(bg=kol) f.bell() f.after(1000,mryg) Prosty przykład z widżetami Frame i Button: biały=true o = Tk( ) f = Frame(o,width=200,height=100,bg='white') f.after(1000,mryg) f.pack() o.mainloop() 04_10.py
nazwa nazwa metody metody w.destroy() działanie działanie Usuwa Usuwa widżet widżet w i i wszystkie wszystkie jego jego dzieci dzieci
from tkinter import * def samobójstwo(): global f f.destroy() Prosty przykład z widżetami Frame i Button: biały=true o = Tk( ) f = Frame(o,width=200,height=100,bg='white') b=button(f,text="przycisk dziecko ramki") b.place(x=10,y=10) f.after(5000,samobójstwo) f.pack() o.mainloop() 04_11.py
Zakładamy, że w jest istniejącym widżetem: nazwa nazwa metody metody w.focus_get() w.focus_set() działanie działanie Zwraca Zwraca widżet, widżet, który który aktualnie aktualnie ma ma skupienie skupienie albo albo None, None, jeśli jeśli żaden żaden widżet widżet nie nie ma ma skupienia skupienia Przenosi Przenosi skupienie skupienie na na widżet widżet w
from tkinter import * Prosty przykład z widżetami Button: def skokskup(): global o,b1,b2 if o.focus_get() == b1: b2.focus_set() else: b1.focus_set() o.after(1000,skokskup) o = Tk( ) b1=button(o,text="pierwszy",highlightthickness=10) b1.pack(); b2=button(o,text="drugi",highlightthickness=10) b2.pack(); o.after(1000,skokskup) o.mainloop() 04_12.py
Zmienne śledzone (traced variables)
TkInter udostępnia zestaw specjalnych klas służących do tworzenia zmiennych, które pozwalają nadzorować zmiany ich wartości niektóre z widżetów używają takich zmiennych do sygnalizowania faktu zmiany stanu bądź też do wpływania na ich stan TkInter definiuje cztery rodzaje takich zmiennych: BooleanVar zmienna logiczna DoubleVar zmienna rzeczywista IntVar zmienna całkowita StringVar zmienna napisowa (łańcuchowa) ze względu na wewnętrzne zależności w TkInter, zmienne takie można tworzyć dopiero po zainicjowaniu okna głównego dalsze przykłady oprzemy o zmienne StringVar, ale nie oznacza to wcale, że pozostałe rodzaje zmiennych śledzonych sa w czymkolwiek gorsze
zmienną śledzoną należy jawnie utworzyć przez pierwszym użyciem czyni się to poprzez przypisanie do zmiennej wyniku zwracanego przez konstruktor klasy: napis = StringVar()
przypisanie wartości do zmiennej śledzonej wykonuje się metodą set(): napis.set("mieczów ci u nas dostatek") przypisywana wartość musi być zgodna z rodzajem zmiennej (nie przypisuj łańcucha do DoubleVar itd.)
odczytanie wartości zmiennej śledzonej wykonuje się metodą get(): print(napis.get()) uzyskana wartość będzie zgodna z rodzajem zmiennej
do istniejące zmiennej śledzonej można dodać obserwatora, co czyni się metodą trace() obsid = zmienna.trace(tryb_śledzenia, obserwator) tryb_śledzenia to: "r" jeśli chcemy śledzić odczyty ze zmiennej "w" jeśli chcemy śledzić zapisy do zmiennej "u" jeśli chcemy śledzić unicestwianie zmiennej obserwator to funkcja, która zostanie wywołana, jeśli zajdzie któreś ze śledzonych zdarzeń wynikiem funkcji jest napis identyfikujący obserwatora
obserwator powinien być zadeklarowany jako funkcja z trzema parametrami: def obs(id,ix,act): id wewnętrzny identyfikator zmiennej (nieprzydatne) ix w TkInter zawsze pusty łańcuch act znak informujący, jaka akcja spowodowała wywołanie obserwatora ('r', 'w', 'u') jeśli żaden z tych argumentów nie jest nam potrzebny, obserwator może być zadeklarowany tak: def obs(*a):
usunięcie obserwatora przeprowadza się metodą trace_vdelete(): zmienna.trace_vdelete(tryb_śledzenia,obsid) tryb_śledzenia to jak poprzednio obsid to identyfikator obserwatora uzyskany z trace()
Prosty przykład użycia zmiennej śledzonej: from tkinter import * def obsczyt(*a): print("czytanie") def obszapi(*a): print("zapisywanie") o = Tk( ) zmienna=stringvar(); zmienna.set("abc") obsido=zmienna.trace("r",obsczyt) obsidz=zmienna.trace("w",obszapi) zmienna.set(zmienna.get()) zmienna.trace_vdelete("r",obsido) zmienna.set(zmienna.get()) zmienna.trace_vdelete("w",obsidz) o.mainloop() 04_13.py