GUI v Tk snadno a rychle (2)

18. 11. 2004
Doba čtení: 6 minut

Sdílet

V minulém dílu jsem se letmo dotkl základních prostředků Tk. V dnešním se zaměřím na hojně používaná primitiva, bez kterých se asi neobejdete.

V Tk existuje mnoho primitiv, některá budete používat prakticky pořád, o jiných se zase nemusíte ani dozvědět. Já se pokusím vytvořit výčet té první skupiny.

Při vývoji GUI je často potřeba vytvořit vstupní pole, do kterého je uživateli umožněno vložit vstupní informace. Takovouto činnost zaopatřuje primitivum entry. Je to klasické jednořádkové textové pole, které navíc zpracovává mnohé kombinace kláves jistě známé např. z Emacsu (Ctrl-A, Ctrl-E, Ctrl-K atd.), ale dokonce pracuje i se systémovou schránkou. Pomocí volby -textvariable určíte proměnnou, která bude odrážet stav textového pole, -state je pro určení stavu (činné, nečinné). Zajímavá je volba -validate, která vám umožní sledovat a kontrolovat uživatelský vstup. Často vznikne požadavek na textové pole, které bere za přípustné jen určité znaky, nebo z jiných důvodů sleduje počínaní uživatele. Volba -validate určuje, kdy má ke kontrole docházet. Implicitní hodnotou je none, což znamená, že k žádnému sledování nebude docházet. Dále to jsou focusin, který reaguje na získání zaměření, focusout pro ztrátu zaměření a focus, kterému vyhovuje oboje. Nejpraktičtější je key zastávající úlohu stisku klávesy. Samozřejmě existuje hodnota pro všechny typy událostí, a tou je all. Obslužná rutina se přidruží volbou -vcmd. V této rutině jsou k dispozici speciální proměnné, které odrážejí různé skutečnosti. Uvozují se znakem procento ( %) a název se skládá pouze z jednoho písmena. Vstupní pole, které je určeno pouze pro přirozená čísla, by se mohlo napsat následovně:

entry .e -validate key -vcmd { kontrola "%S" }
pack .e

proc kontrola {znak} {
    if {[string is integer "$znak"] == 1} {
        return true
    } else {
        puts "$znak neni cislo !"; return false
    }
}

Příkazem entry vytvoříme vstupní pole, které bude reagovat na stisk klávesy procedurou kontrola. Této proceduře je předána hodnota proměnné %S, což je znak(y) (přes systémovou schránku můžete vložit více než jeden znak), jenž byl přidán. Pokud validační procedura souhlasí se vstupem, vrátí nějakou reprezentaci hodnoty pravda, v opačném případě nepravda. Jednoduché a výkonné.

Pokud by vám snad nestačil jeden řádek, použijte primitivum text. Nejen že poskytuje kompletní podporu textových operací, ale navíc do něj můžete vkládat další primitiva, a tím vytvářet hypertextové nebo dokonce i interaktivní stránky (existuje hypertextový prohlížeč manuálových stránek TkMan). Vkládané prvky se dělí do tří skupin tag, mark a embedded window.

  • Pomocí tag ů se formátuje text, ale je i možno k nim přidružit obslužné rutiny událostí.
  • mark se odkazuje na určité místo v dokumentu – jako kotva.
  • Poslední skupinou je embedded window. Ta je určena pro vkládání dalších primitiv.

Textové primitivum text obsahuje opravdu velké množství voleb a kompletní výčet možností by zabral několik dílů (konec konců by byl zbytečný, neboť jej můžete nalézt v dokumentaci k Tk). Uvedu tedy opět jen ty nejdůležitější vlastnosti. Velikost můžete explicitně určit volbami -width (horizontální rozměr) a -height(vertikální rozměr), které jsou počítány ve znacích. Zalamování řádků se určuje volbou -wrap a přípustné hodnoty jsou none (automaticky nezalamovat), char (zalamovat mezi znaky – implicitní) a word (zalamovat mezi slovy).

Když už máme primitivum text vytvořeno, můžeme v něm vytvářet a následně vkládat jednotlivé prvky. Tak např.:

text .t -width 80 -height 25
pack .t

.t tag configure podtrzeny -underline 1
.t tag configure cerveny -foreground red

.t insert end "Podtrzenny retezec\n" podtrzeny
.t insert end "Cervene psanne\n" cerveny

Tato ukázka vytvoří primitivum text s rozměry 80×25 a zobrazí jej. Následně vytváří tagy pojmenované podtrzeny pro podtržený text a cerveny pro text psaný červeným písmem. Vložení textové informace se provádí za pomoci volby insert. Jako první parametr se uvede místo vložení, v tomto případě end (konec), nebo by se také dalo použít absolutních souřadnic ve tvaru sloupec.radek. Následuje samotný řetězec, jenž se má vložit, a jeho formát.

Prvky typu mark jsou jakoby odkazy. Přistupuje se k nim pomocí volby mark, a krom toho, že můžete vytvářet vlastní, existují i implicitní. Dva z nich jsou insert  – místo kurzoru – a current, jenž ukazuje na místo začátku výběru. Mezi těmito a svými vlastními marky potom můžete skákat.

Aby toho nebylo málo, do Tk primitiva text je umožněno vkládat i jiná primitiva. To provádí volba window, za kterou následují další parametry. Jedním z nich je -create. Opět se pokračuje souřadnicemi, které se mají použít při vložení, a pomineme-li další volitelné parametry, následuje -window, za nímž už je samotné primitivum.

.t window create 1.1 -window [button .t.tl -text "Hello"]

Na první řádek, první sloupec bude vloženo tlačítko .t.tl. K takovému tlačítku se můžete chovat jako ke kterémukoliv jinému. Jak jsem se již zmínil, existuje mnoho a mnoho konfiguračních voleb, a proto neuškodí si prolítnout dokumentaci dodávanou s Tk.

Jistě si říkáte, že by se v souvislosti s primitivem text docela hodila nějaká posuvná lišta. Takovou je  scrollbar.

scrollbar .yroll -command ".t yview"
text .t -width 80 -height 25 -yscrollcommand ".yroll set"

pack .t -side left
pack .yroll -side left -fill y

Primitivum .yroll vykonává při každém posunu příkaz následovaný za -command. Tento příkaz nastaví zobrazovanou plochu primitiva text podle stavu posuvné lišty. Na druhé straně primitivum text se o liště dozví za pomoci -yscrollcommand. Tímto postupem stmelíte jednotlivá primitiva, a ta se následně chovají v závislosti na jiných.

Takovým často používaným případem vstupního objektu je stupnice scale. Je to vlastně pouhý výběr čísla z určitého rozsahu. Podobně jako stavová tlačítka, i stupnice využívá ke komunikaci globální proměnnou, pomocí níž sděluje svůj stav. Taková globální proměnná je automaticky obnovována, takže neustále odráží skutečný stav.

label .l -textvariable prom
scale .sc -orient horizontal -from 128 -to 256 \
    -variable prom -showvalue false

grid .sc -row 0 -column 0 -columnspan 2
grid .l -row 1 -column 0
label .l0 -text "MB"
grid .l0 -row 1 -column 1

Všechna primitiva Tk, ke kterým je přiřazena určitá proměnná, tuto proměnnou monitorují (pro zajímavost příkaz vwait) a při změně se ihned náležitě aktualizují. V předchozím příkladu jsem vytvořil popisek, který je určen pro zobrazení hodnoty proměnné prom, jenž je upravována primitivem scale. Všimněte si, že proměnná prom není nikde vytvořena. To není chyba – interpreter takovouto proměnnou vytvoří sám, a to v globálním zásobníku. Stupnice je horizontálně položena a umožní uživateli vybrat jednu z hodnot v rozsahu <128;256>. Dále stojí za povšimnutí parametr -showvalue. Jak již název napovídá, jedná se o rozhodnutí, zda hodnotu stupnice zobrazovat, či ne. Z toho vyplývá, že tento příklad je nadmíru vyumělkovaný :-).

Výběr pouze z určitého rozsahu čísel je vcelku frustrující. Velmi častým požadavkem je i omezený výběr řetězců. Takovouto funkci zaopatřuje primitivum listbox. Toto primitivum vytváří seznam hodnot, přičemž je jen na vás, zdali poskytnete výběr jednoduchý, nebo vícenásobný. Nejlepší bude, když se podíváte na příklad:

ict ve školství 24

label .nadpis -text "Programming languages"
listbox .seznam -selectmode multiple -width 20 -height 10

.seznam insert end "C"
.seznam insert end "Python"
.seznam insert 0 "Tcl/Tk"
.seznam insert end "Java"

pack .nadpis -side top
pack .seznam

Nejprve vytvoříme listbox s názvem .seznam v režimu multiple =vícenásobný výběr (také by šlo single pro opak). Následující řádky ilustrují vkládání prvků do tohoto seznamu. První dvě položky jsou vloženy na konec (end) listboxu. Ovšem položka „Tcl/Tk“ je vložena na absolutní pozici, a tou je první řádek. Kromě příkazu insert jsou k dispozici i get, delete, index a scan, které, máte-li zájem, můžete najít v dokumentaci dodávané s jazykem Tk. Jak je tedy vidět, v tomto směru se listbox od primitiva text nijak moc neliší.

Tak to by bylo pro dnes asi vše. V dalším dílu se zaměřím na další důležitá primitiva, a to na nabídky a dialogová okna.

Autor článku