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 4941×

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ů

27.2.2015 7:20 /MaReK Olšavský
Svobodný databázový projekt RethinkDB není klasickou RDBMS, pro ukládání JSON dokumentů. Na stránkách Opensource.com vyšel rozhovor s Slavou Akhmechetem, zakladatelem RethinkDB.
Přidat komentář

27.2.2015 7:20 /MaReK Olšavský
Intel zjednodušil značení Atomů určených pro mobilní zařícení. Když uživatel uvidí Atom x3 a Atom x7 v popisu zařízení, napoví mu to více o výkonu, než stávající číselné značení (Z3570, Z3770).
Přidat komentář

26.2.2015 7:25 /MaReK Olšavský
Úspěšný výrobce ARM SoC Allwinner významně porušuje GPL „rabováním“ zdrojových kódů.
Přidat komentář

24.2.2015 7:15 /MaReK Olšavský
Blížící se Cinnamon 2.6 bude výrazným skokem kupředu zejména z pohledu uživatelů vícemonitorových sestav, případně oceníte lepší chování „multimediálních kláves“.
Přidat komentář

24.2.2015 7:15 /MaReK Olšavský
Neobvyklý počet 100 ARM jader (64 bitových) by měl nabídnout nový mikroprocesor EZchip. Izraelská společnost jím míří do míst, kde je potřeba vysoký výkon. BTW: U RedHatu se také pilně pracuje na podpoře 64 bitového ARMu.
Přidat komentář

19.2.2015 7:20 /MaReK Olšavský
Příznivci leteckých simulátorů se mohou zaradovat, vyšel FlightGear 3.4. Vylepšila se práce s pamětí, přibyla drobná vylepšení grafiky, nebo nová letadla. Uršitě bude brzo v repozitářích distribucí, ale nákup na e-shopu si určitě vývojáři zaslouží.
Přidat komentář

19.2.2015 7:20 /MaReK Olšavský
Další ohlášení konce se týká projektu m0n0wall, jehož vývojáři dělali distribuci FreeBSD pro nasazení jako firewallu. Můžeme čekat podobný osud, jako u Bodhi Linuxu, nebo #!, jež byly záhy reinkarnovány?
Přidat komentář

18.2.2015 6:57 /MaReK Olšavský
Minimalistická distribuce s desktopem Enlightenment (E19) se má čile k životu, po reinkarnaci, a vydání Bodhi Linuxu 3.0.0 je k dispozici uživatelům. Vedle vydání pro „běžná PC“ vyšla verze i pro staré systémy a Chromebooky. Bohužel zatím nepřevzali z Ubuntu způsob povýšení na novou verzi a tak uživatelé starší verze musí upgradovat reinstalací.
Přidat komentář

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

> Poslední diskuze

2.2.2015 6:40 / MaReK Olšavský
Re: Churchill

30.1.2015 13:16 / Petr Ježek
Churchill

27.1.2015 12:58 / Ladislav Kulatý
Re: Mazání adřářů v linuxu pro IP kamery

26.1.2015 23:57 / Sinuhed
Re: Mazání adřářů v linuxu pro IP kamery

26.1.2015 11:05 / Sinuhed
Re: Mazání adřářů v linuxu pro IP kamery

Více ...

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