Tk

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania
Ujednoznacznienie Ten artykuł dotyczy biblioteki programistycznej. Zobacz też: TK (ujednoznacznienie).

Tkwolna, wielosystemowa biblioteka służącą do budowania graficznych interfejsów użytkownika (GUI).

Zostało wymyślone i opracowane 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[edytuj | edytuj kod]

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[edytuj | edytuj kod]

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[edytuj | edytuj kod]

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ść[edytuj | edytuj kod]

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[edytuj | edytuj kod]

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ń[edytuj | edytuj kod]

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[edytuj | edytuj kod]

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[edytuj | edytuj kod]

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.

Linki zewnętrzne[edytuj | edytuj kod]

Generic Tk i Tcl/Tk:

Perl/Tk:

Ruby/Tk:

Python/Tk, znane również jako Tkinter:

C++/Tk: