Podstawowe kontrolki w tkinter

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 66444 razy

Kontrolka Label

Kontrolka Label jest jedną z najprostszych kontrolek. Służy ona najczęściej do wyświetlania tekstu lub (rzadziej) elementów graficznych. Oto przykład utworzenia takiej kontrolki:

import tkinter as tk # ładowanie modułu tkinter (w wersji 3+) window = tk.Tk() # tworzenie okna głównego window.title( "Hello World" ) # ustawienie tytułu okna głównego # tworzenie kontrolki typu label label = tk.Label( window, text = "Witaj Świecie programowania\nCo swym urokiem nas zabawia\nCo otwiera nowe możliwości\nZ binarnych liczb złożoności" ) label.pack( side = tk.BOTTOM ) # podpinanie kontrolki pod okno tk.mainloop() # wywołanie pętli komunikatów

Konstruktor klasy Label może przyjmować następujące parametry:

Label(window=None, **options)

Tworzy obiekt klasy kontrolki typu Label odpowiedzialnej za wyświetlanie tekstu lub obrazu, gdzie:

Kontrolka tekstowa Entry i kontrolka przycisku Button

Kontrolka Entry służy do wczytywania jedno liniowego tekstu. Przykład użycia tejże kontrolki oraz kontrolki Button znajduje sie poniżej.

import tkinter as tk # ładowanie modułu tkinter (w wersji 3+) window = tk.Tk() # tworzenie okna głównego window.title( "Hello World" ) # ustawienie tytułu okna głównego # tworzenie kontrolki typu label text = tk.StringVar() label = tk.Label( window, textvariable = text, padx=100, pady=20) label.pack() # podpinanie kontrolki pod okno text.set("Witaj Świecie programowania\nCo swym urokiem nas zabawia\nCo otwiera nowe możliwości\nZ binarnych liczb złożoności") description = tk.Label(window, text="Podaj proszę swoje imie:").pack() name = tk.Entry(window,width=40) name.pack() def HelloWorld(): text.set("Witaj {0} w świecie programowania\nCo swym urokiem nas zabawia\nCo otwiera nowe możliwości\nZ binarnych liczb złożoności".format(name.get())) ok = tk.Button(window, text="OK", width=20, command=HelloWorld) ok.pack() tk.mainloop() # wywołanie pętli komunikatów

Opcje konstruktora klasy Entry

Konstruktor klasy Entry przyjmuje taką samą listę argumentów co klasy Label, jedynie opcje nieco się różnią:

Opcje konstruktora klasy Button

Kontrolka Text

Kontrolka ta umożliwia wpisywanie, wczytywanie i wyświetlanie tekstu wieloliniowego. Oto przykład kodu wykorzystującego tę kontrolkę:

import tkinter as tk window = tk.Tk() # tworzenie okna głównego programu window.geometry("500x500") # ustawienie wymiarów okna window.title("Przykładowy program z użyciem kontrolki Text") # ustawienie tytułu okna textbox = tk.Text(window, width = 100, height = 50) textbox.pack() textbox.place(x=10, y=10) textbox.insert(tk.END, "Witaj Świecie", ("h1")) # tekst z formatowaniem zapisanym w znaczniku h1, który nieco później zostanie utworzony textbox.insert(tk.END, "n") textbox.insert(tk.END, "Witaj świecie programowania,nCo będziesz nas dziś tu zabawiał", ("p")) # dodawanie tekstu bez dodatkowego formatowania textbox.tag_add("h1", "1.0", "1.0") # dodanie nowego tagu o nazwie h1 (jak nagłówek główny w HTML-u), drugi i trzeci argument to początek zaznaczenia i koniec zaznaczenia (w tym przypadku wybrałem, że zaznaczenia nie będzie 1 - oznacza pierwszy wiersz a liczba po kropce określa numer znaku w danym wierszu textbox.tag_config("h1", background="yellow", foreground="blue", font=("Times New Roman", 20)) # formatowanie tekstu: kolor tła; kolor tekstu; czcionka podana jako krotka z: nazwą kroju, rozmiarem textbox.tag_add("p", "1.0", "1.0") textbox.tag_config("p", foreground="#1130ff") window.mainloop() # wywołanie głównej pętli programu

Powyższy kod pokazuje sposób, w jaki można tworzyć i wykorzystywać w przebiegły wręcz sposób tagi do bardziej zaawansowanego formatowania tekstu. Widok okna programu został pokazany na poniższym rysunku.

Widok programu napisanego w Pythonie z wykorzystaniem modułu tkinter i kontrolki Text
Rys. 1
Przykład użycia kontrolki Text

Opcje, z jakimi można wywołać konstruktor kontrolki Text:

Kontrolka Checkbox

Kolejną z podstawowych kontrolek jest Checkbox będący kontrolką wyboru (zaznaczenia i odznaczenia). Oto przykład utworzenia tej kontrolki:

var = tk.IntVar() # zmienna przechowująca dane typu int, która zostanie przypisana do kontrolki checkbutton = tk.Checkbutton(window, text="Rozwiń", variable=var) checkbutton.pack() checkbutton.select() # przełączam w stan zaznaczenia

Opcje, które już wcześniej nie zostały opisane:

Kontrolka Radiobutton

Kontrolka tego typu umożliwia stworzenie serii przycisków, które umożliwiają stworzenie opcji jednokrotnego wyboru. Oto prosty kod:

rb_var = tk.StringVar() # zmienna sterująca zaznaczeniem kontrolki rb_female = tk.Radiobutton(window, variable = rb_var, value = "k", text = "kobieta") # kontrolka pierwsza rb_male = tk.Radiobutton(window, variable = rb_var, value = "m", text = "mężczyzna") rb_var.set("k") # ustawiam zaznaczenie na kontrolkę dla opcji kobieta rb_female.pack() rb_male.pack()

Lista ważniejszych dla tej kontrolki opcji:

Kontrolka Listbox

Kontrolka Listbox umożliwia wyświetlania listy wyboru różnych pozycji. Oto przykład programu wykorzystującego taką listę:

import tkinter as tk import datetime as dt window = tk.Tk() # tworzenie okna głównego programu window.geometry("430x160") # ustawienie wymiarów okna window.title("Przykładowy program") # ustawienie tytułu okna labelDescription = tk.StringVar() # zminna, która będzie ustawiała tekst wypisywany w kontrolkach label = tk.Label(window, textvariable = labelDescription) # tworzenie kontrolki Label z ustawieniem wyświetlania tekstu zawartego w zmiennej typu StringVar labelDescription.set("Przykładowy label:") # ustawienie tekstu zawartego w zmiennej oraz (jednocześnie) w kontrolce label label.pack() # wstawianie kontrolki do okna głównego label.place(x= 10, y = 10) # zmiana położenia kontrolki w oknie edit = tk.Entry(window, width = 50, textvariable = labelDescription) # tworzenie kontrolki Entry z przypisaniem jej zmiennej labelDescription edit.pack() # dodawanie jej do okna edit.place(x = 10, y = 30) # zmiana położenia kontrolki w oknie głównym def buttonClicked(): # zdarzenie związane z kliknięciem przycisku labelDescription.set(dt.datetime.now()) # tutaj ustawiam zawartość zmiennej labelDescription i jednocześnie zmieniam tekst wyświetlany w kontrolce Label button = tk.Button(window, text = "Wczytaj bierzącą datę", command = buttonClicked) # tworzę przycisk, który będzie wstawiał datę button.pack() # wstawiam przycisk na okno główne button.place(x = 10, y = 50) # ustawiam położenie przycisku ct_listbox = tk.Listbox(window, width=50, height = 4) # tworzę kontrolkę listbox ct_listbox.pack() # wstawiam ją w oknie ct_listbox.place(x = 10, y = 80) # ustawienie położenia kontrolki ct_listbox.insert(tk.END, "Tydzień dzieci ma siedmioro") # dodaję pierwszy element do kontrolki def listboxSelect(index): # to będzie funkcja, którą podepnę pod zdarzenie <<ListboxSelect>> - wywoływane, gdy zmienione zostanie zaznaczenie w kontrolce labelDescription.set(ct_listbox.get(ct_listbox.curselection())) # tutaj wyciągam tekst zaznaczenie i wstawiam go do zmiennej labelDescription co powoduje wyświetlenie tego tekstu w kontrolkach Entry i Label for item in ["Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota", "Niedziela"]: # iteruję po elementach listy ct_listbox.insert(tk.END, item) # wstawiam je kolejno do listbox-a ct_listbox.bind('<<ListboxSelect>>', listboxSelect) # łączę zdarzenie zmiany zaznaczenia z funkcją listboxSelect window.mainloop() # wywołanie głównej pętli programu

W powyższym kodzie oprócz pokazania jak utworzyć kontrolkę typu Listbox pokazałem jak:

Dostępne opcje konstruktora klasy Listbox w znacznym stopniu się pokrywają z tymi, które już wcześniej wymienione zostały. Z tego też względu poniżej wypiszę tylko ich listę:

Kontrolka Scrollbar

Kontrolki tego typu to paski przewijania, które jako takie mogą być podpinane pod kontrolki takie jak Text czy Entry. Przykład zastosowania kontrolki Scrollbar jako paska przewijania poziomego dla kontrolki typu Scrollbar.

import tkinter as tk window = tk.Tk() # tworzenie okna głównego programu window.geometry("440x180") # ustawienie wymiarów okna window.title("Przykładowy program z użyciem kontrolki Text") # ustawienie tytułu okna sb_textbox = tk.Scrollbar(window) # tworzenie kontrolki paska przewijania textbox = tk.Text(window, width = 50, height = 10, yscrollcommand = sb_textbox.set) # tworzenie textbox-a i podpinanie pod yscrollcommand metody set z paska przewijania textbox.pack() sb_textbox.place(in_ = textbox, relx = 1., rely = 0, relheight = 1.) # ustawienie miejsca oraz wymiarów paska przewijania (relatywnie w odniesieniu do wymiarów kontrolki textbox-a textbox.place(x=10, y=10) textbox.insert(tk.END, "Pan Tadeusz", ("h1")) # tekst z formatowaniem zapisanym w znaczniku h1, który nieco później zostanie utworzony textbox.insert(tk.END, "n") textbox.insert(tk.END, """Litwo! Ojczyzno moja! ty jesteś jak zdrowie. Ile cię trzeba cenić, ten tylko się dowie, Kto cię stracił. Dziś piękność twą w całej ozdobie Widzę i opisuję, bo tęsknię po tobie. Panno Święta, co jasnej bronisz Częstochowy I w Ostrej świecisz Bramie! Ty, co gród zamkowy Nowogródzki ochraniasz z jego wiernym ludem! Jak mnie dziecko do zdrowia powróciłaś cudem (Gdy od płaczącej matki pod Twoją opiekę Ofiarowany, martwą podniosłem powiekę I zaraz mogłem pieszo do Twych świątyń progu Iść za wrócone życie podziękować Bogu), Tak nas powrócisz cudem na Ojczyzny łono. Tymczasem przenoś moję duszę utęsknioną Do tych pagórków leśnych, do tych łąk zielonych, Szeroko nad błękitnym Niemnem rozciągnionych; Do tych pól malowanych zbożem rozmaitem, Wyzłacanych pszenicą, posrebrzanych żytem; Gdzie bursztynowy świerzop, gryka jak śnieg biała, Gdzie panieńskim rumieńcem dzięcielina pała, A wszystko przepasane, jakby wstęgą, miedzą Zieloną, na niej z rzadka ciche grusze siedzą.""", ("p")) # dodawanie tekstu bez dodatkowego formatowania textbox.tag_add("h1", "1.0", "1.0") # dodanie nowego tagu o nazwie h1 (jak nagłówek główny w HTML-u), drugi i trzeci argument to początek zaznaczenia i koniec zaznaczenia (w tym przypadku wybrałem, że zaznaczenia nie będzie 1 - oznacza pierwszy wiersz a liczba po kropce określa numer znaku w danym wierszu textbox.tag_config("h1", font=("Times New Roman", 20)) # formatowanie tekstu: kolor tła; kolor tekstu; czcionka podana jako krotka z: nazwą kroju, rozmiarem textbox.tag_add("p", "1.0", "1.0") textbox.tag_config("p", foreground="#1130ff") sb_textbox.config(command = textbox.yview) # podpinanie pod kontrolkę paska przewijania metody yview textbox-a window.mainloop() # wywołanie głównej pętli programu

Wynikiem działania powyższego kodu jest widoczny na poniższym rysunku.

Przykład użycia kontrolki scrollbar z modułu tkinter języka programowanie Python
Rys. 2
Przykład użycia kontrolki scrollbar z modułu tkinter języka programowanie Python

Kontrolka Spinbox

Kontrolka ta umożliwia wczytywanie wartości liczbowych i jest wyposażona automatycznie w mały pasek "przewijania" wartości. Możliwe jest również ustawienie minimalnej i maksymalnej możliwej wartości, jaka może zostać wpisana. Oto prosty przykład kodu tworzenia takiej kontrolki:

value = tk.IntVar() spinbox = tk.Spinbox(window, from_ = 3, to = 10, textvariable = value) spinbox.pack()
Widok kontrolki Spinbox z modułu tkinter języka programowania Python
Rys. 3
Widok kontrolki Spinbox z modułu tkinter języka programowania Python

Kontrolka Scale

Ta z kolei kontrolka przypomina nieco kontrolkę Scrollbar, jednakże ta kontrolka służy do ustawiania i wyświetlania wartości liczbowych. Oto przykład kodu tworzącego taką kontrolkę:

scale = tk.Scale(window, from_ = 0, to = 10, orient=tk.HORIZONTAL) # tworzę kontrolkę typu Scale przyjmującą wartości całkowite od 0 do 10 i ustawioną na ułożenie poziome scale.pack() variable = tk.StringVar() label = tk.Label(window, textvariable = variable) # to będzie kontrolka pomocnicza label.pack() def scale_changed(ch): variable.set(ch) # tu będę wyświetlał dane, mógłbym je wyciągnąć również korzystając z metody get: scale.get() scale.config(command = scale_changed) # podpinam funkcję scale_changed pod zdarzenie wywoływane, gdy wartość ustawienia kontrolki została zmieniona

Na poniższym rysunku można zobaczyć przykład kontrolki typu Scale.

Widok kontrolki Scale z modułu tkinter języka programowania Python
Rys. 4
Widok kontrolki Scale z modułu tkinter języka programowania Python

Kontrolka Canvas

Jak sama nazwa wskazuje, kontrolka ta służy do rysowania po niej elementów graficznych. Co ciekawe wszystkie elementy rysowane w tejże kontrolce są przechowywane i odrysowywane z pamięci. Można rzec, że ta kontrolka służy do wyświetlania elementów graficznych przechowywanych w pamięci, czyli jest to grafika wektorowa.

import tkinter as tk window = tk.Tk() window.title("Rysowanie") window.geometry("500x500") def draw(event): # metoda, którą podepnę pod zdarzenie ruchu myszki nad kontrolką canvas z wciśniętym lewym przyciskiem myszy canvas.create_oval(event.x - 2, event.y - 2, event.x + 2, event.y + 2) # tworzę okrąg na kontrolce canvas przy każdym ruchu myszką canvas = tk.Canvas(window, width = 450, height = 450) # tworzę kontrolkę typu Canvas canvas.place( x= 25, y = 25) # umieszczam ją na ekranie canvas.create_rectangle((0, 0, 450, 450), fill="#ffffff", width = 0) # rysuję biały prostokąt canvas.bind("<B1-Motion>", draw) # podpinam zdarzenie pod kontrolkę window.mainloop()

Przykład działania tego prostego programu widoczny jest na poniższym rysunku.

Przykład zastosowania kontrolki Canvas z modułu tkinter do rysowania za pomocą myszki
Rys. 5
Przykład zastosowania kontrolki Canvas z modułu tkinter do rysowania za pomocą myszki
Propozycje książek