LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> Perl (117) - Tk - některé pokročilejší widgety

Perl Navážeme na předchozí díl a podíváme se na pár dalších widgetů. Tentokrát půjde o widgety, které již mají složitější strukturu a větší množství vlastností.

1.10.2010 00:00 | Jiří Václavík | Články autora | přečteno 4545×

Víceřádkové textové pole s posuvníkem

Víceřádkový vstup lze realizovat pomocí prvku Text. Umožňuje uživateli editovat více řádků textu.

Lze nastavit vlastnosti state (pro vypnutí nastavíme na disabled) a dále height, width. Podívejme se nyní na metody. V několika metodách využíváme parametru pozice, což bývá řetězec, jež může mít několik různých tvarů. Zde je několik intuitivních příkladů, jak lze specifikovat pozici.

  • číslo_řádku.číslo_sloupce
  • insert (aktuální pozice)
  • end (konec textu)
  • +počet lines, -počet lines, +počet chars, -počet chars (relativní určení pozice)
  • linestart, lineend, wordstart, wordend (opět relativní určení)
NázevVýznam
get(pozice1, pozice2)vrátí text, volitelně pouze na určeném rozsahu
insert(pozice, text)vloží text na zadanou pozici
see(pozice)přesune pohled na text tak, aby byla vidět daná pozice
search(vzor, pozice1, pozice2)vyhledá text
search(volby --, vzor, pozice1, pozice2)to samé, ale lze určit následující volby intuitivního významu: exact, backward, forward, regexp, nocase, count proměnná_kam_se_uloží_délka_nalezeného_řetězce
indexvrátí index tvaru číslo_řádku.číslo_sloupce
markSet, markUnsetzáložky na pozice

Ukažme si příkazy, které nejprve vytvoří textové okno a pak vloží na nějakou pozici zadaný text.

$pole = $m->Text(-width=>100, -height=>4)->pack();
$pole->insert("3.50", "toto se vlozi na zadanou pozici");
$pole->insert("end", "toto se vlozi na konec textu");

Prvek Text nabízí tzv. tagování, což je možnost nastavení stylu písma. Je možné si nadefinovat styl o nějakém názvu a pak ho používat.

$text->tagConfigure("styl", -foreground=>"green", -background=>"black");
$text->insert("1.1", "tento text je napsan stylem 'styl'.", "styl");
$text->tagAdd("styl", "2.2", "4.4");

Je-li pole moc malé, nemá pole implicitně oproti jiným knihovnám žádný posuvník. Ten je potřeba dopsat ručně. Nejprve tedy vytvoříme posuvník pomocí Scrollbar a poté ho přiřadíme textovému poli pomocí -xscrollcommand nebo -yscrollcommand a nakonfigurujeme, aby se posunoval současně s textem.

$posuvnik = $m->Scrollbar();
$text = $m->Text(-yscrollcommand => ["set", $posuvnik]);
$posuvnik->configure(-command => ["yview", $text]);

$posuvnik->pack(-side=>"right", -fill => "y");
$text->pack(-side => "left");

Více oken

Je-li potřeba více než-li jedno okno, použijeme prvek Toplevel. K novému oknu se můžeme chovat stejně jako k hlavnímu oknu. Zde jsou příkazy, které vytvoří druhé okno a nastaví mu titulek.

$okno2 = $m->Toplevel;
$okno2->title("Toto je druhe okno");

Druhé okno se otevře v okamžiku, kdy dojde k vykonání těchto příkazů. Může se tak stát hned po spuštění programu nebo až po nějaké uživatelem vyvolané akci.

Menu

Existuje více metod, jak vytvořit menu. Některé si tu v následujících odstavcích představíme.

Menu přes rámečky

Vytvoření menu se skládá z několika kroků.

Nejprve je potřeba vyhradit pro menu lištu, kam pak umístíme jednotlivé nabídky. Lištu vytvoříme pomocí prvku Frame (který lze též použít pro uspořádávání většího množství prvků na stránce pomocí seskupení). Obvykle se lišta umísťuje nahoru a proto metodě pack sdělíme, že právě tam chceme menu umístit. To uděláme předáním argumentu -side => "top".

Nabídky vytvoříme pomocí Menubutton. Do každé nabídky dále přidáme příslušné položky, k čemuž existuje metoda command.

$lista=$m->Frame()->pack(-side => "top");
$nabidka_soubor = $lista->Menubutton(-text => "Soubor", -borderwidth=>1,
  -relief=>"raised")->pack(-side=>"left", -padx=>1);
$nabidka_soubor->command(-label=>"Otevrit", -accelerator=>"Ctrl+O", -command=>\&otevrit);
$nabidka_soubor->command(-label=>"Ulozit", -accelerator=>"Ctrl+S", -command=>\&ulozit);
$nabidka_soubor->command(-label=>"Konec", -accelerator=>"Ctrl+Q", -command=>sub{exit});

$nabidka_oprogramu = $lista->Menubutton(-text => "O programu", -borderwidth=>1,
  -relief=>"raised")->pack(-side=>"left", -padx=>1);

Výsledkem bude následující menu.

Menu

V Tk má menu ještě několik dalších možností. Přímo do něj lze přidávat přepínací a zaškrtávací položky. Mezi naše nabídky Soubor a O programu vklíníme ještě jednu, kde si je vyzkoušíme.

Metoda radiobutton vytvoří přepínací položku. Funguje stejně jako prvek Radiobutton a tedy je třeba specifikovat parametr -variable, kterým svážeme tyto položky s nějakou proměnnou. Analogicky funguje metoda checkbutton. Také se může hodit metoda separator, která vloží do vybrané nabídky oddělovač. Zkusme přidat do našeho příkladu následující kód.

$nabidka_upravy = $lista->Menubutton(-text => "Upravy", -borderwidth=>1,
  -relief=>"raised")->pack(-side=>"left", -padx=>1);
$nabidka_upravy->radiobutton(-label=>"Zalamovat", -variable =>\$zalamovani);
$nabidka_upravy->radiobutton(-label=>"Nezalamovat", -variable =>\$zalamovani);
$nabidka_upravy->separator();
$nabidka_upravy->checkbutton(-label=>"Ukladat automaticky", -variable =>\$ukladat);

Získáme následující menu.

Složitější menu

Menu přes vlastnost hlavního okna

Nyní využijeme speciální vlastnosti hlavního okna prvku Menu. Nejprve tedy vytvoříme menu a poté pomocí configure nastavíme vlastnost -menu hlavního okna. Dále již můžeme vytvářet nabídky pomocí metody cascade a jednotlivé položky pomocí command.

$menu = $m->Menu();
$m->configure(-menu => $menu);

$nabidka_soubor = $menu->cascade(-label=>"Soubor");
$nabidka_soubor->command(-label=>"Konec", -command=>sub{exit});

$nabidka_oprogramu = $menu->cascade(-label=>"O programu");
$nabidka_oprogramu->command(-label=>"Info", -command=>sub{$m->messageBox(
  -message=>"Tento program vznikl v roce 2010 a jinak nic nedela", -type => "ok")});

Menu vytvořené tímto způsobem lze obarvovat. Metoda command má mimo jiné parametry -background a -activebackground (resp. -foreground a -activeforeground), které nastavují stálou barvu a barvu při přejetí myší. Zde je příklad takového barevného tlačítka.

$nabidka_soubor->command(
    -label => "Special",
    -activebackground => "green",
    -activeforeground => "orange",
    -background => "orange",
    -foreground => "green",
    -command => sub{$m->messageBox(-message => "Stiskl jsi barevne tlacitko!")}
);

Podívejme se na výsledek.

Barevné menu po rozbalení *** Barevné menu při přejetí položky myší

Grafická plocha

Prvek Canvas umožňuje vytvářet základní grafické objekty, to jest body, úsečky, kružnice, křivky, a podobně. Každý takovýto objekt je navíc skutečně objektem i z programátorského hlediska, a tak lze snadno konfigurovat jeho vlastnosti.

Obecně pro nakreslení nějakého objektu na grafickou plochu voláme metodu create. Tato metoda přijímá jako první argument typ objektu a ostatní argumenty již závisejí na něm. Jako typy lze volit arc, bitmap, image, line, polygon, oval, rectangle, text, window. Také lze volat přímo metody createLine, createOval apod.

Každý vytvořený objekt má nějaké vlastnosti. Zde je několik vlastností, které mají všechny nakreslené objekty.

VlastnostVýznam
-fillbarva vnitřku
-outlinebarva okraje
-widthtloušťka okraje
-stipple, -outlinestipplevykreslí objekt vzorem

Uveďme ještě vlastnosti specifické pro konkrétní objekty.

ObjektParametrVlastnostVýznam
Obloukarc-startpočáteční úhel
-extentrozpětí
-stylepieslice, chord nebo arc
Bitmapa resp. obrázekbitmap resp. picture-anchorstrany pro ukotvení
-bitmap resp. -imagesoubor
Úsečkaline-arrowzobrazení šipky; možné jsou hodnoty none, first, last, both
-arrowshapehodnotou je odkaz na pole o 3 prvcích, které specifikují rozměry šipky
Texttext-texttext, který se má zobrazit
-justifyzarovnání; možnosti jsou left, right, center
-anchorukotvení
Oknowindow-windowvloží jiný prvek do grafické plochy

Zde je ukázka umístění několika objektů do grafické plochy.

$p=$m->Canvas(-width=>500, -height=>200, -background => "green");
$p->create("line", 10, 50, 100, 150);
$p->createLine(10, 20, 100, 150, -width => 5, -fill => "yellow");
$p->createRectangle(100, 80, 400, 50, -fill => "blue");
$p->createOval(60, 100, 120, 200, -fill => "red");
$p->createText(300, 160, -text=>"toto je canvas", -fill=>"white",
  -font=>"-*-*-*-*-*--25-*-*-*-*-*-*");
$p->pack();

Po spuštění programu se zobrazí následující.

Grafická plocha

Podívejme se ještě na některé metody, které lze nad objektem Canvas volat.

MetodaVýznam
create("objekt", x, y, ...), create("objekt", x1, y1, x2, y2, ...)vytvoří objekt
coords(objekt, nová_pozice), move(objekt, nová_pozice)přesune objekt na souřadnice nová_pozice resp. na relativní pozici
raise, lowerposune objekt nahoru, dolů
scaleupraví rozměry objektu
deletesmaže objekt
itemconfigure(objekt, parametry)konfiguruje objekt
postscriptvygeneruje postscript soubor
find("příkaz")vyhledá seznam vyhovujících objektů; například "closest x y", "below $objekt" atd.
bindsvázání s událostí

Verze pro tisk

pridej.cz

 

DISKUZE

Nejsou žádné diskuzní příspěvky u dané položky.



Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

1.9.2014 6:55 /MaReK Olšavský
Lennart Poettering, známý díky práci na PulseAudio a systemd, sepsal svou vizi sestavení software v distribuci. Rád by viděl pohromadě systemd, btrfs, nebo sjednocení uspořádání adresářů knihoven napříč distribucemi a hlavně vysokou míru zabezpečení.
Přidat komentář

1.9.2014 6:55 /MaReK Olšavský
Vyšlo 88. číslo Full Circle Magazine (pdf, ePub). Měsíčník, nejen pro uživatele *Ubuntu, obsahuje články o ripování DVD pomocí Handdrake, vlastní kompilaci jádra a pravidelné seriály.
Přidat komentář

1.9.2014 6:55 /MaReK Olšavský
Javascriptová/CSS knihovna YUI zůstane dalšího vývoje od Yahoo. Yahoo ukončuje vývoj, protože rozsáhlý YUI ztrácí na poularitě. Pokud bude vývoj pokračovat v nezávislé komunitě, nebude se muset framework přejmenovat?
Přidat komentář

29.8.2014 7:11 /MaReK Olšavský
Vývojáři webových aplikací v PHP získají s novým PHP 5.6 i novou komponentu phpdbg pro ladění aplikací. Celý seznam novinek podrobně rozebírá migrační příručka.
Přidat komentář

29.8.2014 7:11 /MaReK Olšavský
Populární Raspberry Pi má dalšího konkurenta, avšak nový minipočítač Creator CI20 nevyužívá mikroprocesor rodin ARM a x86, nýbrž MIPS32. Zatím je k dispozici pouze vývojářům.
Přidat komentář

29.8.2014 7:11 /MaReK Olšavský
Red Hat opouští CTO Brian Stevens, jenž do RH přišel v roce 2001 z DECu.
Přidat komentář

28.8.2014 6:46 /MaReK Olšavský
Superpočítač za US$ 99, to je Parallella, jejíž vývojáři uspěli s kampaní na Kickstarteru před 18 měsíci. Co předcházelo uvedení na trh shrnuje článek Andrewa Backa. Otevřená platforma pro paralelní výpočty neznamená „jen“ vývoj hardware, ale i napsání SDK.
Přidat komentář

28.8.2014 6:46 /MaReK Olšavský
Zajímavá je historie Motoroly, jež byla průkopníkem mobilních telefonů, ale známá byla i díky mikroprocesorům, jež jsme měli v Amigách/Atari ST, nebo byly v prvních počítačích SUN Microsystems.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

29.8.2014 14:31 / viperDavid
Re: Python s Lighttpd

27.8.2014 12:45 / Marek Pszczolka
LinuxMarket

27.8.2014 11:19 / Jan Němec
To je hlod

25.8.2014 16:20 / Aleš Hakl
Re: Kdyby autoři BeoSu nebyli blbci

24.8.2014 22:32 / Atrament
Překlep v 'properties'

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2014) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze | zákony online