import modułu dla ułatwienia nadajemy mu skrót 'tk'
1 | import tkinter as tk |
możemy importować również tak
1 | from tkinter import * |
Poniżej będą jednak wywoływane z użyciem skrótu 'tk'.
Pierwszy konstruktor Tk, który tworzy obiekt okna głównego
1 2 3 4 | import tkinter as tk okienko=tk.Tk() okienko.mainloop() |
metoda okienko.mainloop() to uruchomienie pętli głównej (kontrolera zdarzeń) dzięki której okienko cały czas reaguje na nasze akcje.
Nazwa okienka i przycisk Button:
Metoda title klasy Tk ustawia tytuł okna.
1 2 3 4 5 6 7 | import tkinter as tk okienko=tk.Tk() okienko.title("Okienko") guzik=tk.Button(okienko , text="Hej") guzik.place(x=15, y=15) okienko.mainloop() |
konstruktor klasy Button tworzy obiekt nazwany 'guzik' reprezentujący przycisk
guzik=tk.Button(okienko , text="Hej")pierwszym argumentem "okienko" jest nazwa obiektu okna do którego widżet będzie należeć
metoda place() klasy Button umieszcza przycisk na wskazanej pozycji (w pikselach)
Tworzenie pierwszego callbacka:
Callback to bezparametrowa funkcja wywołana przez kontroler zdarzeń po określonej akcji.
Tworzymy prosty callback 'Click' który zapewnia sobie dostęp do globalnej zmiennej okienko i poprzez metodę destroy() zamyka okienko po czym dowiązujemy go do widżetu Button (parametr command)
1 2 3 4 5 6 7 8 9 10 11 12 13 | import tkinter as tk def Click(): global okienko okienko.destroy() okienko=tk.Tk() okienko.title("Okienko") guzik=tk.Button(okienko , text="Hej", command=Click) guzik.place(x=15, y=15) okienko.mainloop() |
dodatkowo możemy uzupełnić callbacka o zapytanie czy chce wyłączyć okienko. Za pomocą klasy messagebox wyświetlamy komunikat pytania. Klasa wymaga zaimportowania:
1 2 3 4 5 6 7 8 | import tkinter as tk from tkinter import messagebox def Click(): global okienko odp = tk.messagebox.askquestion("Pytanie","Jesteś pewień?") if odp=='yes': okienko.destroy() |
Rozmieszczanie widżetów:
Geometry menager Tkintera oferuje 3 metody rozmieszczania widzętów w oknie
1) place() - z dokładnością do piksela
2) pack() - automatycznie jeden za drugim
3) grid() - półautomatycznie w siatce z wyrównaniem
1) place(x,y) - (pozioma, pionowa) start w lewym górnym rogu, dodatkowo możemy dodać parametry szerokości i wysokości przycisku
1 2 3 4 5 6 7 8 9 10 11 12 13 | import tkinter as tk okno=tk.Tk() g1=tk.Button(okno, text="Guzik1") g2=tk.Button(okno, text="Guzik2") g3=tk.Button(okno, text="Guzik3") g1.place(x=5,y=5,width=120) g2.place(x=35,y=35,height=60) g3.place(x=85,y=85,) okno.mainloop() |
wynik:
Nie potrzebujemy tworzyć zmiennych w których przechowywane są widżety jeśli dostęp do niech nie będzie później potrzebny:
1 2 3 4 5 6 7 8 9 | import tkinter as tk okno=tk.Tk() tk.Button(okno, text="Guzik1").place(x=5,y=5,width=120) tk.Button(okno, text="Guzik2").place(x=35,y=35,height=60) tk.Button(okno, text="Guzik3").place(x=85,y=85,) okno.mainloop() |
2) pack(side.tk.opcje)
opcje:
TOP - ku górze okna macierzystego (Domyślne)
BOTTOM - ku dołowi
LEFT
RIGHT
3) grid(opcje_siatki)
row - rząd
column - kolumna
columnspan - liczba kolumn zajetych przez widzet
rowspan - liczba wierszy zajetych przez widżet
Zdarzenia
Widżety które nie mają parametru command (wywołanie callbacka, przeważnie te nie klikalne) mają metodę bind.
1 | widzet.bind(zdarzenie,callback) |
która po określonym zdarzeniu na widżecie wywoła callbacka.
Przykładowe zdarzenia:
<Button-1> pojedyncze kliknięce lewym przyciskiem myszy
<Button-2> pojedyncze kliknięcie środkowym przyciskiem myszy (o ile jest dostępny)
<Button-3> pojedyncze kliknięcie prawym przyciskiem myszy (o ile jest dostępny)
<ButtonRelease-1> zwolnienie lewego przycisku myszy
<DoubleButton-1> podwójne kliknięcie lewego przycisku myszy
<Enter> kursor myszy pojawił się nad widżetem
<Leave> kursor myszy opuścił obszar widżetu
<Focus-In> widżet (albo jego dziecko) przejął skupienie
<Focus-Out> widżet (albo jego dziecko) stracił skupienie
<Return> użytkownik nacisnął klawisz Enter
<Key> użytkownik nacisnął jakiś klawisz
<KeyRelease> zwolnienie klawisza klawiatury
Uwaga callback dla parametru command powinien być funkcją bezparametrową, natomiast dla metody bind() powinien być funkcją z jednym parametrem. Żeby ominąć ten problem i nie pisać osobnych funkcji dopisujemy w parametrze funkcji (zdarz=None)
1 2 | def clik(zdarz=None): tk.messagebox.showinfo("Nazwa","klikasz sobie") |
Można bind ale można i unbind. Istnieje też metoda bind_all oraz unbind_all.
Zmienne śledzone
Tkinter ma zestaw klas które tworzą zmienne pozwalające nadzorować zmiany ich wartości.
Niektóre z widżetów używają tych zmiennych do sygnalizowania zmiany stanu lub wpływania na ich stan.
• BooleanVar zmienna logiczna
• DoubleVar zmienna rzeczywista
• IntVar zmienna całkowita
• StringVar zmienna napisowa (łańcuchowa)
zmienną śledzoną należy utworzyć przed pierwszym użyciem
1 | napisik=StringVar() |
Wpisanie wartości DO zmiennej śledzonej jest możliwe tylko przez metodę set()
1 | napisik.set("To właśnie przypisaliśmy") |
Odczytanie wartości ZE zmiennej jest możliwe tylko przez metodę get()
1 | cotamjest=napisik.get() |
do istniejące zmiennej śledzonej można dodać obserwatora za pomocą metody trace()
1 | obsid = zmienna.trace(tryb_śledzenia, obserwator) |
do 'obsid' zostanie zapisany identyfikator obserwatora
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ń
obserwator powinien być zadeklarowany jako funkcja z trzema
parametrami:
1 | 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:
1 | def obs(*a): |

