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.
Vývojář | John Ousterhout |
---|---|
První vydání | 1991 |
Aktuální verze | 8.6.11 (31. prosince 2020) |
Operační systém | multiplatformní |
Platforma | multiplatformní |
Vyvíjeno v | C |
Typ softwaru | Widget toolkit |
Licence | BSD-style[1] |
Web | www.tcl.tk |
Některá data mohou pocházet z datové položky. |
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 (anglicky binding); 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.[2]
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[3]. 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[4]. 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 (anglicky geometry managers):
- place – umisťuje widgety na absolutní pozice
- grid – rozmisťuje widgety v tabulce (mřížce, anglicky grid)
- 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.[5]
Odkazy
Reference
V tomto článku byly použity překlady textů z článků Tk (software) na anglické Wikipedii, Tk na ruské Wikipedii a Tk na polské Wikipedii.
- Tcl/Tk License Terms
- Tcl Wiki | jazyky s vazbou na Tk
- Ousterhout, John. Historie Tcl, 'Tcl Developer Exchange'. Retrieved on 2010-04-01.
- Tk Backgrounder [online]. Dostupné online.
- Tcler's Wiki [online]. [cit. 2018-11-09]. Kapitola Ttk. Dostupné online.
Související články
- Expect
- Tkinter – Tk vazby pro Python
- Itk
- Itcl
- wish (Windowing Shell)
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 Archivováno 19. 10. 2017 na Wayback Machine
- Tcl/Tk 8.6.2 Documentation
- LTK Common Lisp vazby pro Tk
C++/Tk
- CPPTk – Tk pro C++
Haskell/Tk
Lisp/Tk
- LTK – Tk pro Common Lisp
Perl/Tk
- Tkx::Tutorial – tutoriál Perl/Tk
Python/Tk
Ruby/Tk
- Learn Tk Archivováno 21. 10. 2017 na Wayback Machine – tutoriál Ruby/Tk