Tk (framework)
Tk je svobodný multiplatformní widget toolkit s otevřenými zdrojovými kódy poskytující knihovnu základních ovládacích prvků pro tvorbu grafického uživatelského rozhraní (GUI) v různých programovacích jazycích.

Tk poskytuje množství ovládacích prvků potřebných k vytváření grafických aplikací jako například tlačítko, menu, canvas, text, rám, label, atd. Tk bylo portováno na většinu odrůd GNU/Linuxu, macOSu, Unixu a Microsoft Windows. Od verze Tcl/Tk 8 poskytuje „nativní look a feel“ (například menu a tlačítka jsou zobrazovány stejně jako u programů vyvinutých na příslušné platformě). Tk bylo navrženo jako rozšiřitelné a je dostupné množství rozšíření, která poskytují nové ovládací prvky nebo jiné funkcionality.

Verze 8.5 obsahuje nové jádro pro používání témat (theming engine), původně nazývané Tk Tile, ale nyní obecně označovaná jako „themed Tk“. Stejně jako Tcl podporuje Tk Unicode, zatím omezené na Basic Multilingual Plane. Na unixových systémech používá Tk do verze 8.4 stále bitmapové fonty, ale Tk 8.5 používá vektorové fonty (především TrueType a OpenType fonty).

Podpora programovacích jazyků 
Knihovna napsaná v jednom programovacím jazyce může být používána v jiných jazycích, jestliže pro ně existují vazby (); pro Tk je dispozici množství vazeb pro různé jazyky: AdA (nazývaný TASH), Haskell (nazývaný HTk), Perl, Python (nazývaný Tkinter), Ruby, Rexx a Common Lisp.

Použití 
Viz :Kategorie:Software používající Tk

Historie 
Tk vytvořil John Ousterhout jako rozšíření pro skriptovací jazyk Tcl. Tk bylo poprvé zveřejněno na Internetu v roce 1991. Až do verze 8.0 bylo číslování verzí Tk oddělené od Tcl.

Tk bylo původně napsáno pro Unix/X11 a v 90. letech 20. století stalo se velice oblíbené mezi programátory díky tomu, že je podstatně snazší na naučení a používání než Motif a jiné tehdejší dominantní toolkity pro X11. Tk bylo ve verzi Tk 4.2 portováno také na platformy Microsoft Windows a Macintosh, a vylepšeno o nativní look and feel ve verzi Tk 8.0 (vydané v roce 1997). Snadnost použití a podpora na různých platformách spolu se snadností s jakou lze Tk a pod ním fungující interpret Tcl vestavět do jiného softwaru, z nich vytvořil de facto standardní GUI toolkit pro skriptovací jazyky.

Na konci 90. let 20. století zájem o Tk poklesl. Na Unixu jeho implicitní look and feel stále emuluje Motif, přestože hlavní proud softwaru používá toolkity Qt a GTK+. Widgety, které se začaly široce používat v aplikacích (například stromy, combo boxy, tabbed notebooks), jádro Tk neposkytovalo, takže bylo nutné používat množství často konkurenčních doplňků.

Na konci roku 2007 vyšlo Tk 8.5, které napravilo některé z uvedených problémů přidáním chybějících widgetů do jádra, přineslo novou theming engine a zmodernizovalo look and feel na Unixu. Protože však pro zahrnutí těchto vylepšení bylo nutné provést určité změny kódu, mnoho existujících aplikací stále používá starší vzhled inspirovaný rozhraním Motif, díky kterému se Tk stalo známým. Většina starší dokumentace na Internetu nebyla nikdy aktualizována, aby odrážela tato vylepšení, i když web TkDocs poskytuje aktuální průvodce zaměřené na moderní nejlepší praktiky.

Architektura 

Tk je platformně nezávislý GUI framework vyvinutý pro Tcl. Ve standardním interpretu Tcl – Tcl shellu (tclsh) – lze Tk zpřístupnit příkazem package require Tk. Program wish (WIndowing SHell) spuští tclsh shell v grafickém okně a zároveň zpřístupňuje Tk.

Nejvýznamnější vlastnosti Tk:

 Platformně nezávislé: Podobně jako Tcl, je Tk interpretovaný jazyk, který byl portován na mnoho platforem, a může běžet i bez modifikace.
 Uživatelsky přizpůsobitelné: Téměř všechny vlastnosti widgetů v Tk lze upravit pomocí voleb během vytváření widgetu nebo později pomocí příkazu configure.
 Konfigurovatelné: Množství nastavení (options) může být uloženo v databázi nastavení, což usnadňuje parametrizaci vzhledu aplikace (například barevné schéma). Znamená to, že pro uložení nastavení aplikace stačí uložit příkazy pro přidání nastavení a při načítání aplikace je provést.

V jazyce Perl lze Tk používat dvěma způsoby: pomocí modulů Tcl::Tk a Tkx Perl, oba z nich pro zpřístupnění Tk a Perl/Tk používají Tcl, což Perlu poskytuje nativní přístup k Tk strukturám. Také Python a Ruby a většina jazykových vazeb pro ostatní jazyky používají Tcl jako most k Tk.

Widgety 
Tk poskytuje následující widgety:

 button
 canvas
 checkbutton
 combobox
 entry
 frame
 label
 labelframe
 listbox
 menu
 menubutton
 message
 notebook
 tk_optionMenu
 panedwindow
 progressbar
 radiobutton
 scale
 scrollbar
 separator
 sizegrip
 spinbox
 text
 treeview

Mimoto poskytuje následující okna nejvyšší úrovně:

 tk_chooseColor – otevře dialogové okno umožňující uživateli vybrat barvu.
 tk_chooseDirectory – otevře dialogové okno, které uživateli umožní vybrat adresář.
 tk_dialog – vytvoří modální dialog a čeká na odezvu.
 tk_getOpenSFile – otevře a dialogové okno, které uživateli umožní vybrat soubor, který se má otevřít.
 tk_getSaveFile – otevře dialogové okno, které uživateli umožní zadat jméno ukládaného souboru.
 tk_messageBox – otevře zpráva okno a čeká na odezvu uživatele.
 tk_popup – vytvoří vyskakovací menu.
 toplevel – vytváří a manipuluje s widgety nejvyšší úrovně.

Tk také poskytuje tři správce geometrie ():

 place – umisťuje widgety na absolutní pozice
 grid – rozmisťuje widgety v tabulce (mřížce, )
 pack – umisťuje widgety do volného prostoru

K neobvyklým a mnohaúčelovým vlastnostem Tk patří prvek canvas a textové prvky, které poskytují funkcionality dostupné pouze v několika málo jiných widget toolkitech.

Objektově orientované widgety jsou dostupné jako Itk (též incr Tk) a Iwidgets. Nad Tk je postaveno mnoho dalších užitečných widgetů, jako například TkTreeCtrl, BLT (toolkit), Tix Mega-Widgets a TSIPP (3D Graphics Toolkit).

Programování v Tk 
Tk skript je normální skript v jazyce Tcl, ve kterém je možné díky použití balíčku Tk další příkazy. Na rozdíl od „normálního“ Tcl Tk skript pouze definuje, jaké grafické prvky se mají vykreslit a jak má program reagovat na jejich použití. Vlastní provedení aplikace se provádí až po dokončení skriptu, protože na jeho konci program používající Tk neskončí, jako programy v Tcl, ale vstoupí do smyčky událostí. Spuštění této smyčky lze také provést ručně příkazem tkwait; jinak bude tento příkaz implicitně proveden na konci skriptu. Aplikace může být ukončena normálně, ukončením příkazu tkwait nebo explicitním provedením příkazu exit.

Jména oken v Tk mají tvar cesty (podobající se úplnému jménu souboru), v nichž jsou jednotlivé složky odděleny tečkami. Hlavní okno aplikace typu toplevel (které nemá rodiče) s názvem .. Je možné vytvořit i další toplevel okna, a okno . je možné zavřít. Pokud je však . jediné existující okno toplevel, pak jeho uzavření způsobí ukončení příkazu tkwait a tím se celá aplikace ukončí.

Jména widgetů jsou uspořádána do cesty podobným způsobem jako hierarchie oken (tato hierarchie může být vynechána, ale nedoporučuje se to). Proto pokud máme tlačítko umístěné přímo v okně toplevel, můžeme jej nazvat .btn. V hlavním okně však můžeme umístit rámeček, řekněme .f1 a právě uvnitř tohoto tlačítka – pak by měl být nazván .f1.btn.

Vytváření widgetů a správci geometrie 
Tk obsahuje řadu widgetů potřebných k vytvoření desktopových aplikací, jako jsou tlačítka, nabídky, texty, rámečky, štítky atd. Widgety jsou vytvořeny pomocí odpovídajících příkazů, kde prvním argumentem je cesta cesty widgetu. Tyto příkazy navíc také akceptují parametry specifické pro daný widget, například:

 button .btn -text "Klikni na mě!" -command {exit}

vytvoří tlačítko s nápisem Klikni na mě!; po jeho stisknutí se provede příkaz exit, který ukončí aplikaci. Aby tlačítko bylo vidět, je nutné jej umístit do nadřízeného widgetu a tak je zobrazit. Tk nabízí tři možnosti pro umístění widgetů do rodičovských oken:

 pack – umísťuje widgety vedle sebe nebo pod sebou k okrajům nadřízeného widgetu
 grid – umísťuje widgety do obdélníkové mřížky
 place – umísťuje widget na zadanou pozici vzhledem k nadřazenému oknu

Nejoblíbenější (a nejjednodušší k použití) metodou rozmísťování prvků je pack. Pro zobrazení widgetu v rodičovském okně . stačí zavolat příkaz pack, jemuž se jako parametr zadá jméno :

 pack .btn

Hierarchické pojmenování widgetů určuje jejich umístění. Každé okno má jediné nadřazené okno, takže příkazy vám řeknou, kam ho umístit. V příkaze pro vytváření widgetu však lze zadat, do jakého nadřízeného widgetu se má vytvářený widget umístit, pomocí parametru -in.

Konfigurace 
Každý widget, bez ohledu na parametry, které mu jsou přiřazeny při jeho vytváření, lze měnit za běhu. Jméno, které widget dostane při svém vytvoření, lze použít jako příkaz (což je v Tcl často používaný přístup, například při implementaci tříd a objektů v Incr Tcl ). Tento příkaz má dva nejdůležitější „podpříkazy“ (které bývají nazývány metodami, protože podobně jsou metody implementovány v Incr Tcl): cget a configure. Metoda cget slouží k načtení hodnotu parametru widgetu, configure k jeho modifikaci. Výše vytvořené tlačítko tak může být v průběhu zpracování změněno příkazem:

 .btn configure -text "Ukončit aplikaci"

Události 
Tk, kromě přímého propojení s widgety, jak jsme viděli na příkladu tlačítka, nabízí také propojení s událostmi. Událost je obvykle popsána jménem uzavřeným mezi <...>. Událost je vysílána konkrétním widgetem. Pomocí příkazu bind lze zaregistrovat vlastní akci, kterou chcete provést při události.

Události lze rozdělit na standardní a virtuální. Standardní události jsou události „pevně“ zabudované v knihovně Tk a přímo souvisejí s událostmi přicházejícími z okna systému. Jedná se například o stisknutí klávesy na klávesnici (např. <Return>, <Control-C>), akce myší (např. <Double-Button-1>, <MouseEnter>, <MouseWheel>). Tyto události také často poskytují zvláštní argumenty zvláštním způsobem. Tyto argumenty jsou označeny znakem % a odpovídajícím znakem značky v následném příkazu. Např. příkaz:

 bind .x <MouseWheel> "MouseScroll %D"

zajistí reakci na otočení kolečka myši nad widgetem .x (pamatujte, že widget, který reaguje na kolečko myši, se liší v systému Windows – okno zaostření – a okno X11, na kterém je ukazatel myši), a získá požadované posunutí ve widgetu.

Existují také virtuální události, které může definovat program (příkaz add event). Jména virtuálních událostí se zapisují mezi << ... >>. Widgety, které implementují textový editor, mohou například definovat událost <<Paste>>. Virtuální události je možné generovat příkazem event generate.

Vázání událostí 
Tk používá několik metod pro propojení widgetů s akcemi, které se podobají mechanismu signálů a slotů. Tyto mechanismy zahrnují:

 události popsané výše
 parametr -command, která přiřazuje příkaz k výchozí akci widgetu (například kliknutí na tlačítko)
 parametry -variable a -textvariable, které provážou widget s proměnnou; změna widgetu způsobí změnu hodnoty proměnné a naopak

Správce oken 
V grafických aplikacích hraje důležitou roli komunikace s window managerem, což je aplikace, která se v systému stará o „dekoraci“ oken toplevel. Tuto komunikaci zajišťuje příkaz wm. Umožňuje vyžádat operace, které zajišťuje správce oken – např. minimalizaci, maximalizaci, ikonizaci, zjištění a nastavení velikosti okna a registrace událostí, které pocházejí od správce oken. Lze například předepsat zavření okna uživatelem:

 wm protocol .x WM_DELETE_WINDOW ExitWindowX

Tile a Ttk 
Od října 2006 obsahuje Tcl/Tk balíček Tile, díky kterému se vzhled Tk widgetů přibližuje přirozenému vzhledu operačního systému případně v něm používaným knihovnám, např. Aqua, standardnímu vzhledu systému Windows XP, dokonce i TileQt. Od verze Tk 8.5a6 je toto rozšíření pod názvem Ttk přímo součástí Tk.

Odkazy

Reference

Související články 
 Expect
 Tkinter – Tk vazby pro Python
 Itk
 Itcl
 wish (Windowing Shell)

Externí odkazy

Tcl/Tk 
 Tcl Developer Xchange: Oficiální web Tcl a Tk
 Wiki pro uživatele Tcl
 wiki.tcl.tk/486 – Beginning Tk na wiki tcl tk
 Tk 8.6 Manuál
 ActiveTcl 8.6 Dokumentace
 Tk docs: moderní Tk tutorial pro Tcl, Ruby, Perl a Python
 Tcl-Tk v archivu webu dmoz 
 Tcl/Tk 8.6.2 Documentation
 LTK Common Lisp vazby pro Tk

Ada/Tk 
 TASH – Tcl/Tk binding pro jazyk Ada

C++/Tk 
 CPPTk – Tk pro C++

Haskell/Tk 
 HTk – is an encapsulation of the graphical user interface toolkit and library Tcl/Tk for the functional programming language Haskell

Lisp/Tk 
 LTK – Tk pro Common Lisp

Perl/Tk 
 Tkx::Tutorial – tutoriál Perl/Tk

Python/Tk 
 Tkinter

Ruby/Tk 
 Learn Tk  – tutoriál Ruby/Tk

SML/Tk 
 sml_tk: Functional Programming for Graphical User Interfaces – Tk pro Standard ML

Widget toolkity
Rozhraní pro programování aplikací
Svobodný software