![]() | |
![]() | |
Vývojář | John Ousterhout |
---|---|
Aktuální verze | 8.6.6 (2016-07-27) |
Operační systém | multiplatformní |
Vyvíjeno v | C |
Typ softwaru | knihovnaovládacích prvků GUI |
Licence | podobná BSD |
Web | http://www.tcl.tk/ |
Některá data mohou pocházet zdatové položky. |
Tk (zanglickéhoToolkit – „sada nástrojů“) jemultiplatformníknihovna základních prvkůgrafického uživatelského rozhraní, kterou vyvinulJohn Ousterhout jako rozšířeníinterpretovanéhoprogramovacího jazykaTcl.
Tk poskytuje saduTcl příkazů určených k vytvářeníovládacích prvků a dalších komponentgrafického uživatelského rozhraní a provádění různých akcí s nimi.
KnihovnaTk je distribuovaná jakootevřený software a bylapřenesena na většinu implementací systémůLinux,OS X,Unix aMicrosoft Windows. Pomocí speciálních knihoven může být knihovna Tk použita i v jiných programovacích jazycích, například vPerlu,Pythonu neboRuby. Většina těchto jazyků používáTcl jako most pro Tk.[1]
Od verze 8 mají widgety „nativní“ vzhled prostředí příslušnéhooperačního systému, to znamená, že grafické prvky vypadají stejně jako prvky standardní pro tento OS. Od verze 8.5 je možné pro kreslení prvků použít engine s podporou motivů nazvaný Ttk.[2] Existuje také několik rozšíření, které implementujíDrag and drop mezi aplikacemi v Tk a externími aplikacemi, nepravoúhlá okna a podobně.
Komponenty jsou uspořádány v hierarchické struktuře. Z pohledu aplikace existuje hlavní nebo primární okno, ve kterém jsou vytvořena podřízená okna. Podřízená okna mohou zase působit jako rodiče ve vztahu k jiným oknům atd. Rozmístění komponentů řídí správce rozvržení nebo geometrie (anglickygeometry manager), který určuje velikost komponent a jejich umístění na obrazovce.
Aplikace Tk, stejně jako většina aplikací v grafických prostředích, jsou programy řízené událostmi. Tk komponenty většinu událostí zpracovávají automaticky, což zjednodušuje vytváření aplikací.
Spuštění Tk skriptu obvykle začíná vytvářením komponent a jejich umístěním pomocí správce rozvržení, po němž skript přidružuje obslužné rutiny událostí se součástmi. Poté, co interpret dokončí analýzu příkazů odpovědných za inicializaci uživatelského rozhraní, přejde do smyčky událostí. Od tohoto okamžiku začne aplikace reagovat na akce uživatele.
Pro Tk existují další sady komponent, například BWidget[3], Tix[4] nebo incr Widgets[5]. Výhodou využití BWidget je, že není třeba kompilovat konkrétní platformu (jeho kód je „čisté“ Tcl).
Standardním interpretemTcl je programtclsh
; pro interpretaci skriptů v Tcl/Tk slouží příkazwish
(Windowing Shell). Na systémech standarduPOSIX je wish interpretTcl s vestavěnýmTk; na jiných systémech se oba příkazy liší jen tím, žewish
automaticky provedepackage require Tk
, čímž zajistí načtení balíčku Tk zdynamické knihovny.
Tk skript je normální skript v jazyceTcl; zavedením balíčku Tk však přibudou příkazy pro vytváření prvků a ovládánígrafického uživatelského rozhraní neboliwidgetů.
Zatímco ve „standardním“Tcl se veškerá činnost provádí z hlavního programu (těla skriptu), v Tk se v něm pouze definují jednotlivé prvky rozhraní a jejich vazby na události. Vlastní komunikace s uživatelem se uskutečňuje po provedení posledního příkazu těla skriptu, kdy program vstoupí do smyčky událostí. Smyčka událostí je realizována příkazemtkwait
, který se implicitně spouští na konci těla skriptu, může však být vyvolán i explicitně. Aplikace končí buď ukončením příkazutkwait
nebo explicitním provedením příkazuexit
.
Tk poskytuje následující příkazy pro vytváření widgetů:
toplevel
–okno, ve kterém zobrazují ostatní prvky; první okno se jménem.
se automaticky otevře při zavedení Tkcanvas
– plátno – plocha, na kterou lze rozmístit další prvky; používá se pro kreslení geometrických objektů nebo pokud je potřeba část okna scrollovat pomocí posuvníkupanedwindow
– okno s posuvnými částmi; umožňuje rozdělení okna na podokna, jejichž velikost lze měnit posouváním rámečkůframe
– rámeček (viditelný nebo neviditelný), kterým lze ohraničit prvky nebo jejich skupinylabelframe
– rámeček přerušený nápisemlabel
– nápis (etiketa)entry
– okénko pro zadání jednoho řádku textu; text může být předvyplněntext
– okno pro editaci víceřádkového textu (může být předvyplněn)button
– obdélníkovétlačítko, na kterém může být nápis nebo obrázek; při kliknutí se zobrazí zamáčknutí tlačítka a provede se určitá akcecheckbutton
–zaškrtávací pole – malá čtvercová ploška, která při klikání mění stav mezi zapnuto a vypnutoradiobutton
–přepínač – skupina kruhových plošek podobných zaškrtávacím polím, kliknutí na jednu z nich dojde k jejímu zapnutí a vypnutí všech ostatních ve skupiněmenu
– klasickánabídka několika možností, kliknutím se provede určitá akce; může být víceúrovňovélistbox
–seznam několika možností uspořádaných podobně jako menu; kliknutím se však místo vyvolání akce vybere příslušná možnostcombobox
–kombinované pole – prvek, který se chová jako kombinace entry a listboxumenubutton
– tlačítko, které se stisknutím rozvine na menuscrollbar
–posuvník, pomocí kterého se lze posouvat na část plátna, textu nebo prvků, které se nemohly zobrazit pro nedostatek prostoruprogressbar
– posuvník ukazující průběh nějaké akcescale
– posuvník sloužící k zadání hodnoty z určitého intervaluspinbox
– entry pro zadání hodnoty doplněný šipkami, kterými lze přidávat nebo ubíratmessage
– otevře nové okno, ve kterém je zobrazena zprávanotebook
– přepínání několika dialogů na stejné ploše pomocí záložek (oslích uší)Prvním parametrem příkazů, které vytvářejí prvky grafického rozhraní, je jméno prvku. Protože toto jméno je strukturováno podobně jakoúplné jméno souboru, bývá v angličtině označováno stejným slovempathname. Zatímco v úplnémjménu souboru jsou jednotlivé části oddělovány znakylomítko nebozpětné lomítko, ve jménech prvků vTcl/Tk se jednotlivé části cesty oddělují znaky tečka (.
). Tečkou musí jméno také začínat; samotná tečka označuje výchozí prvek celé hierarchie, kterým je hlavní okno automaticky vytvořené zavedením balíčku Tk.
Například tlačítkob_yes
umístěné v rámečkuf_top
v okněw2
by se mělo jmenovat.w2.f_top.b_yes
. Protože Tcl/Tk nevyžaduje, aby jména prvků obsahovala i jména rámečků, lze použít i jméno.w2.b_yes
. V tomto případě je však třeba explicitně zadat, že tlačítko se má zobrazit v rámečku.w2.f_top
.
V grafických aplikacích hraje důležitou roli komunikace sesprávcem oken (window managerem), což je aplikace, která se v systému stará o „dekoraci“ okentoplevel
. Tuto komunikaci zajišťuje příkazwm
. Umožňuje vyžádat operace, které zajišťuje správce oken – např. nastavení velikosti okna, jeho minimalizaci, maximalizaci, ikonizaci, zjištění velikosti okna, a registrace událostí, které pocházejí od správce oken.
Lze také například předepsat zavření okna uživatelem:
wm protocol .x WM_DELETE_WINDOW ExitWindowX
Následující program otevře dvě okna – hlavní o velikosti 320 x 200 pixelů obsahující nápisNápis v hlavním okně
s titulkem (v rámu okna)Hlavní okno
a druhé s titulkemDruhé okno
obsahující nápisNápis v druhém okně
, okolo kterého je ve všech směrech prostor 10 pixelů:
packagerequireTkwmtitle."Hlavní okno"wmminsize.320200label.l-text"Nápis v hlavním okně"pack.l-padx40-pady20setw2[toplevel.w2]wmtitle$w2"Druhé okno"pack[label$w2.l-text"Nápis v druhém okně"]-padx10-pady10
Příkazwm title
změní text v záhlaví okna awm minsize
předepíše jeho minimální velikost (šířka 320pixelů a výška 200pixelů); příkazlabel
připraví nápis, který se provedením příkazupack
zobrazí uvnitř okna.
Příkaztoplevel
vytvoří druhé okno, jehož jméno, resp. cestu.w2
uložíme do proměnnéw2
. Dalším příkazem změníme text v jeho záhlaví. Poslední řádek ukazuje, jak je možné zkombinovat příkazlabel
, který vytvoří nápis, a příkazpack
, který zajistí jeho zobrazení.
Program nedefinuje žádný prostředek pro své ukončení. Ukončí se zavřením hlavního okna.
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í možnosti specifické pro widget, například:
button .btn -text "Konec" -bg blue -fg white -command {exit}
Tlačítko "Konec" po svém stisknutí provede příkazexit
, tj. ukončení aplikace.
Aby byl grafický prvek vidět, je nutné použít správce rozvržení, který jej umístí do nadřízeného widgetu a zajistí jeho zobrazení. Tk poskytuje tři správce rozvržení, které se liší přístupem k umisťování widgetů do rodičovských oken:
Nejoblíbenější (a nejjednodušší k použití) metodou rozmísťování prvků je pack. Pro zobrazení widgetu.btn
v rodičovském okně.
:
pack .btn
Při určování, kde se mají jednotlivé prvky zobrazit, se správci rozvržení řídí jmény widgetů. Ze jména se snaží odvodit, jaké je jeho nadřazené okno. Toto přiřazení lze v rámci jednohotoplevel
okna změnit použitím parametru-in
.
Většinu parametrů, které jsou widgetu 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ů vIncr Tcl). Tento příkaz má dva „podpříkazy“ (které bývají nazývány metodami, protože podobně jsou metody implementovány v Incr Tcl):cget
aconfigure
. Metodacget
slouží k načtení hodnoty vybraného parametru widgetu,configure
k její modifikaci nebo k načtení hodnot všech parametrů. 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"
Tk používá několik metod pro propojení widgetů s akcemi, které se podobají mechanismu signálu a slotů. Tyto mechanismy zahrnují:
-command
, který přiřazuje k výchozí akci widgetu (například kliknutí na tlačítko) Tcl příkaz-variable
a-textvariable
, které propojují widget s proměnnou; změna widgetu způsobí změnu hodnoty proměnné a naopak; na změnu stavu proměnné lze navázat akci příkazemtrace add variable
Kromě přímého propojení proměnných nebo akcí s widgety umožňuje Tk také navázání akcí na události, které jsou zpravidla vysílány konkrétním widgetem. Událost obvykle popisuje text uzavřený mezi znaky<
a>
. Pomocí příkazubind
lze události přiřadit vlastní akci.
Události lze rozdělit na standardní a virtuální. Standardní události jsou události „pevně zabudované“ do knihovny Tk, které 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>
), myši (např.<Double-Button-1>
,<MouseEnter>
,<MouseWheel>
). Tyto události často poskytují speciálním způsobem další argumenty. Argumenty jsou označeny znakem % a odpovídajícím znakem v následném příkazu. Pokud např. použijeme příkaz
bind .x <MouseWheel> "MouseScroll %D"
pak při použití kolečka myši nad widgetem .x (widget, který reaguje na kolečko myši, je jiný v systému Windows – kde jde o okno, které má focus – zatímco v X11 je to okno, ve kterém je ukazatel myši), bude vyvolaný příkaz MouseScroll, který jako argument dostane hodnotu delta udávající velikost posunutí.
Kromě toho existují také virtuální události, které může definovat program příkazemadd 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říkazemevent generate
.
Od října 2006 obsahuje Tcl/Tk balíček Tile, který dovoluje se více přiblížit přirozenému vzhledu operačního systému a dokonce i knihoven, např. Aqua, výchozímu vzhledu systému Windows XP, dokonce i TileQt
Minimalistický program pro čmárání myší v Tcl[6] používá widget canvas, ke kterému jsou navázány akce kliknutí levým tlačítkemmyši a pohyb se stisknutým levým tlačítkem myši. Vazby se definují v proceduředoodle
:
procdoodle{w{colorblack}}{bind$w<1>[listdoodle'start%W%x%y$color]bind$w<B1-Motion>{doodle'move%W%x%y}}
Kliknutím na levé tlačítko se vytvoří objekt čára, jehož počáteční a koncový bod jsou shodné:
procdoodle'start{wxycolor}{set::_id[$wcreateline$x$y$x$y-fill$color]}
Při pohybu myši se stisknutým levým tlačítkem se čára prodlouží:
procdoodle'move{wxy}{$wcoords$::_id[concat[$wcoords$::_id]$x$y]}
Hlavní program má kromě zavedení balíčku Tk pouze tři řádky:
packagerequireTkpack[canvas.c-bgwhite]-fillboth-expand1doodle.cbind.c<Double-3>{%Wdeleteall}
První příkaz vytvoří a zobrazí kreslicí plochu, druhý ji přiřadí výše definované akce. Poslední příkaz definuje, že dvojitým kliknutím pravým tlačítkem myši se kresba smaže.
Následující program zobrazí texty v češtině, řečtině, ruštině, hebrejštině, arabštině, čínštině a japonštině ve widgetu text:
packagerequireTkbindall<Escape>{exit}wmtitle."Exemple Unicode"pack[text.t-font{Arial14}].tinsertend"Čeština:\t\t Příliš žluťoučký kůn úpěl ďábelské ódyŘecká alfabeta:\t\t \u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA \u03AC\u03B3\u03BB\u03CE\u03C3\u03C3\u03B1Azbuka:\t\t \u0420\u0443\u0441\u0441\u043A\u0438\u0439 \u044F\u0437\u044B\u043AHebrejské písmo:\t\t \u05DD\u05D9\u05DC\u05E9\u05D5\u05E8\u05D9\u05DC\u05D9\u05D0\u05E8\u05E9\u05D9Arabské písmo:\t\t \uFE94\uFEF4\uFE91\uFEAE\uFECC\uFEDF\uFE8D\uFE94\uFEE4\uFEE0\uFEDC\uFEDF\uFE8DTradiční čínština:\t\t \u4E2D\u570B\u7684\u6F22\u5B57Japonské písmo:\t\t \u65E5\u672C\u8A9E\u306E\u3072\u3089\u304C\u306A,\u6F22\u5B57\u3068\u30AB\u30BF\u30AB\u30CA"
Digitální hodiny vytvořené na 6 řádcích kódu:
packagerequireTkprocevery{tscript}{eval$scriptafter$t[listevery$t$script]}pack[label.hodiny-textvariabletime-font{Lucida18}]every1000{set::time[clockformat[clockseconds]-format%H:%M:%S]}
V tomto článku byly použitypřeklady textů z článkůTk na ruské Wikipedii,Tk na polské Wikipedii,Tk (Toolkit) na německé Wikipedii aTk (informatique) na francouzské Wikipedii.