Tk

Tk
logo
ilustracja
Autor John Ousterhout
Pierwsze wydanie 1991
Aktualna wersja stabilna 9.0.0
(26 września 2024) [±]
Platforma sprzętowa Wieloplatformowy
System operacyjny Wieloplatformowy
Rodzaj biblioteki programistyczne
Licencja BSD-podobna[1]
Strona internetowa

Tkwolny, wielosystemowy zestaw narzędzi zawierający bibliotekę podstawowych widżetów służący do budowania graficznych interfejsów użytkownika (GUI).

Biblioteka została wymyślona i opracowana przez Johna Ousterhouta jako pakiet języka skryptowego Tcl. Istnieją jednak również dowiązania do Tk spod innych języków, jak Perl (PerlTk), Python (Tkinter), Ruby (RubyTk), a nawet C++ (cpptk).

Tk zostało przeniesione na wiele platform, uruchamia się na Linuksie, Apple Macintoshu, Uniksie oraz systemach z rodziny Windows. Od czasu wydania wersji 8 Tcl/Tk, programy napisane z użyciem Tcl/Tk wyglądają inaczej na każdym systemie, zgodnie z jego ustawieniami (np. pasek menu wygląda inaczej w Macintoshu niż w MS Windows czy Linuksie/X11). Istnieją także różne wtyczki do zapewnienia działającego drag & drop czy innych zaawansowanych właściwości GUI.

Tak samo jak Tcl tak i Tk w pełni obsługuje Unicode.

Tcl, Tk i Wish

Wish (Windowing Shell) jest to nic innego jak interpreter Tcl-a z wbudowanym pakietem Tk. W takiej postaci jest on zwykle dostarczany na systemach POSIX-owych, niemniej w ostatnich wersjach nie ma już większej różnicy, czy jako interpreter użyjemy wish, czy tclsh, tyle że skrypt jeszcze na początku wyda komendę package require Tk. Pakiet Tk powinien wtedy zostać załadowany z biblioteki dynamicznej.

Podstawowe założenia

Skrypt w Tk jest zwykłym skryptem w języku Tcl, jednak pakiet Tk nakłada nań dodatkowe założenia. W odróżnieniu od „zwykłego” Tcl-a, skrypt w Tk ma służyć jedynie dostarczeniu odpowiednich definicji tego, co ma zostać wykonane, utworzeniu odpowiednich podstawowych założeń co do przebiegu programu. Faktyczne wykonanie się aplikacji następuje zaś dokładnie po zakończeniu działania skryptu, wtedy bowiem nie następuje koniec programu, jak to się dzieje w normalnych warunkach, tylko wejście w pętlę zdarzeń. Wejście w ową pętlę można również wykonać ręcznie komendą „tkwait”; komenda ta jest niejako niejawnie wykonana na zakończenie skryptu. Aplikacja może być normalnie zakończona albo w przypadku, gdy zakończy działanie komenda „tkwait”, albo przez jawne wykonanie komendy „exit”.

W Tk wszystkie okna mają swoje nazwy ścieżkowe (podobne do nazw plików), gdzie kolejne elementy rozdzielane są kropką. Istnieje też zawsze główne okno typu „toplevel” (okno bez rodzica) o nazwie „.”. Można tworzyć dodatkowe okna „toplevel”, jak również okno „.” można zamknąć. Jeśli jednak okno „.” jest jedynym istniejącym oknem „toplevel”, to jego zamknięcie przez użytkownika powoduje zakończenie aplikacji (przez zakończenie wykonywania się komendy „tkwait”).

Ścieżki w nazwach widżetów są ułożone wedle podobnej hierarchii, co hierarchia okien (hierarchię tę można co prawda obejść, ale tego się robić nie zaleca). W związku z czym, jeśli mamy przycisk umieszczony bezpośrednio na oknie „toplevel”, to możemy go nazwać np. „.btn”. Możemy jednak na oknie głównym umieścić ramkę, która będzie się nazywała, powiedzmy, „.f1”, a dopiero wewnątrz niej ów przycisk – wtedy należałoby go nazwać „.f1.btn”.

Widżety i ich tworzenie

Tk zawiera szereg widżetów potrzebnych do tworzenia aplikacji desktopowych, takich jak przycisk, menu, tekst, ramki, etykiety itp. Widżety tworzy się za pomocą odpowiadających im komend, gdzie pierwszy argument jest nazwą ścieżkową widżetu. Poza tym, komendy te przyjmują również opcje dotyczące już rzeczy specyficznych dla danego widżetu, np.:

button .btn -text "Click me!" -command { exit }

Taki przycisk będzie miał napis „Click me!”, a po jego naciśnięciu nastąpi wykonanie komendy „exit”, czyli zakończenie aplikacji. Przycisk ten jednak nie będzie widoczny, dopóki nie zażądamy jego umieszczenia. Tk oferuje trzy możliwości umieszczania widżetów na oknach rodzicielskich:

  • place – umieszczanie widżetu na określonej pozycji względem okna rodzicielskiego
  • pack – rozmieszczanie widżetów obok siebie
  • grid – rozmieszczanie widżetów w prostokątnej siatce.

Najpopularniejszym (bo i najprostszym w użyciu) sposobem umieszczania jest pack. Zatem umieśćmy nasz widżet na oknie rodzicielskim „.”:

pack .btn

Hierarchia w nazwach widżetów ma istotne znaczenie właśnie w kwestii umieszczania. Każde okno ma dokładnie napisane, jakie jest jego okno rodzicielskie, dzięki temu komendy umieszczające wiedzą, gdzie ma on zostać umieszczony. Można jednak w tej komendzie wyspecyfikować inne okno rodzicielskie dla umieszczanego widżetu.

Konfigurowalność

Każdy widżet, niezależnie od parametrów, jakie mu się poda podczas tworzenia, można dowolnie rekonfigurować w czasie działania. Nazwa widżetu, który został utworzony odpowiednią komendą, również staje się komendą (jest to metoda stosowana powszechnie w języku Tcl, np. również do implementacji klas i obiektów w Incr Tcl). Komenda ta posiada „na starcie” dwie najważniejsze „podkomendy” (można je też nazywać metodami, bo i podobnie są implementowane metody w Incr Tcl): cget i configure. Powodują one odpowiednio pobranie zawartości danej opcji oraz jej ustawienie. Zatem nasz przycisk możemy w trakcie działania również modyfikować:

.btn configure -text "Exit application"

Zdarzenia

Tk, poza bezpośrednimi dowiązaniami komend do widżetów, jak to widzieliśmy na przykładzie przycisku, oferuje również dowiązywanie do zdarzeń. Zdarzenie zwykle opisuje się napisem zawartym w < ... >. Zdarzenie jest emitowane przez konkretny widżet. Za pomocą komendy bind można zarejestrować własną akcję, jaka miałaby się wykonać w momencie wystąpienia danego zdarzenia.

Istnieją zdarzenia standardowe oraz zdarzenia wirtualne. Zdarzenia standardowe są to zdarzenia wpisane „na sztywno” w bibliotekę Tk i bezpośrednio związane ze zdarzeniami przychodzącymi od systemu okienkowego. Są to np. naciśnięcie jakiegoś klawisza na klawiaturze (np. <Return>, <Control-C>), myszy (np. <Double-Button-1>, <MouseEnter>, <MouseWheel> ). Zdarzenia te często przekazują też w specjalny sposób dodatkowe argumenty. Argumenty te oznacza się w rejestrowanej komendzie za pomocą znaku % i odpowiedniej litery znacznika. Np. jeśli zrobimy:

bind .x <MouseWheel> "MouseScroll %D"

To wtedy w przypadku zakręcenia kółkiem od myszki nad widżetem .x (przypominam, że widżet, do którego przychodzi zdarzenie kółka od myszki jest inaczej określany na Windows – okno ze skupieniem – i X11 – okno, nad którym jest kursor myszy) zostanie wywołana komenda MouseScroll, która jako argument dostanie deltę, o jaką żąda się przesunięcia.

Oprócz tego istnieją także zdarzenia wirtualne, które można sobie samemu definiować („event add”). Zdarzenia takie są zawarte w << ... >>. Np. widżety implementujące edytor tekstu definiują takie zdarzenia jak np. <<Paste>>. Zdarzenia wirtualne można samemu „emitować” („event generate”).

Wiązanie zdarzeń

W Tk używa się kilku metod do powiązania widżetów z wykonywaniem przez nich czynności, podobne w działaniu do mechanizmu sygnałów i slotów. Do takich mechanizmów zaliczamy następujące:

  • zdarzenia, opisane powyżej
  • opcje -command, która podpina wskazaną komendę pod domyślną akcję danego widżetu (np. kliknięcie przycisku)
  • opcje -variable i -textvariable, które wiążą widżet z podaną zmienną; zmiany w widżecie będą synchronizowane z wartością zmiennej i na odwrót.

Menadżer okien

Jedną z istotniejszych rzeczy w Tk jest też komunikacja z tzw. menadżerem okien, czyli aplikacją nadającą „dekoracje” oknom „toplevel” w systemie. Do tego w ogólności służy komenda „wm”. Służy ona do wykonania czynności na menadżerze okien takich jak minimalizacja, maksymalizacja, ikonizacja, pobranie i ustawienie rozmiarów okna, a także rejestracja na zdarzenia przychodzące od menadżera okien. Można np. w ten sposób przechwycić zamykanie okna przez użytkownika:

wm protocol .x WM_DELETE_WINDOW ExitWindowX

Tile

Niedawno stworzony został pakiet Tile, który pozwala dużo lepiej zintegrować się z naturalnym wyglądem danego systemu operacyjnego, a nawet bibliotek – m.in. Aqua, domyślny wygląd Windows XP oraz nawet TileQt.

Przypisy

  1. Tcl/Tk Licensing Terms. [dostęp 2016-09-13]. (ang.).

Linki zewnętrzne