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

> Perl (118) - Tk - čas a události

Perl K bezproblémovému běhu každé aplikace, která má něco smysluplného umět, je potřeba, abychom uměli vyvolávat a zpracovávat události.

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

Práce s časem

Pro odložené nebo opakované vykonávání nějaké akce máme v Tk zabudované metody after a repeat. Metodou after vytvoříme jednorázový příkaz, který bude vykonán za určený čas. Toto je v jistém smyslu analogie s unixovým nástrojem at.

Podobně funguje metoda repeat, která vytváří trvalý příkaz. Zde se akce periodicky opakuje.

Vyzkoušíme si to a napíšeme si jednoduchou hru. Ta bude spočívat v tom, že uživatel musí co nejdéle bez přestávky klikat na tlačítko. Jakmile jednou nestihne kliknout včas, hra skončí a oznámíme mu, kolikkrát se mu podařilo kliknout. V programu využijeme ještě metodu cancel, která jednorázový příkaz ruší.

use Tk;
use strict;

my $m = MainWindow->new();
my $pocetkliku = 0;
my $casovac;

$m->Label(-text=>"Ukolem hry je klikat na tlacitko co nejdele.")->pack();
$m->Button(-text=>"Aktivita!", -command=>\&klik)->pack();
$m->Button(-text=>"Konec", -command=>sub{exit})->pack();

MainLoop();

sub klik {
  $pocetkliku++;
  $casovac->cancel if $pocetkliku!=1;
  $casovac=$m->after(200, \&konec);
}

sub konec {
  $m->messageBox(-message => "Klikl jsi ${pocetkliku}krat.", -type => "ok");
  $pocetkliku = 0;
}

Události

S některými událostmi jsme se setkali již dříve. Šlo například o stisk tlačítka. Teorii událostí nyní podstatně rozvineme.

S událostmi lze manipulovat pomocí metody bind, kterou lze volat nad libovolným widgetem. Předáváme jí typ události a akci, která se má vykonat. Metoda bind nám umožňuje zachytávat takové události jako je například stisky a uvolnění kláves nebo tlačítek na myši, pohyb kurzorem myši.

Zápis událostí

Událost se zapisuje jako nějaký řetězec uzavřený mezi symboly <>. Přesněji řečeno má každá událost následující tvar.

<klávesa1-klávesa2-...-klávesan-typ-symbolické_jméno_klávesy>

Přitom klávesy můžeme dosadit například pro události z myši Button1, Button2, Double, Triple a pro události z klávesnice Control, Alt, Shift. Any zastupuje libovolnou klávesu.

Typ události nabývá jedné z následujících hodnot:

  • ButtonPress - stisk tlačítka myši
  • ButtonRelease - uvolnění tlačítka myši
  • KeyPress - stisk klávesy
  • KeyRelease - uvolnění klávesy
  • Motion - pohyb kurzoru
  • Enter - vstup kurzoru myši na nějakou oblast
  • Leave - opuštění oblasti

Poslední položka, symbolické_jméno_klávesy, nabývá obvykle pro tisknutelné znaky tohoto znaku. Pro jiné klávesy existují speciální řetězce jako například Enter, BackSpace, F7 apod. Kompletní seznam možností je na tcl.activestate.com/man/tcl8.4/TkCmd/keysyms.htm.

Často používané události lze různými způsoby zkracovat zkracovat, takže můžeme vynechávat KeyPress a ButtonPress. Uveďme několik příkladů zápisu události.

  • <KeyPress-q> - stisknuto tlačítko q
  • <Alt-q> - stisknuta tlačítka Alt+q
  • <BackSpace> - stisknut mezerník
  • <Button2> - stisknuto tlačítko 2 na myši
  • <Button2-Motion> - stisknuto tlačítko 2 na myši a ta se přitom pohybuje
  • <1> - stisknuto první tlačítko myši
  • <g> - stisknuta klávesa g
  • <Any-KeyPress> - stisknuta libovolná klávesa

Již bylo řečeno, že příkaz bind sváže událost a akci. bind přijímá jako parametr buď událost nebo posloupnost událostí. Posloupnost se zapisuje jako několik událostí oddělených mezerou.

Zjištění přesné příčiny události

Již jsme zmínili, že událost <Any-KeyPress> znamená stisk libovolné klávesy. Otázkou však je, jak potom zjistíme, která klávesa vlastně byla stisknuta. Řešení nalezneme ve volání funkce Ev, která nám je schopna poskytnout libovolnou informaci o nastálé události. Tato funkce přijímá parametr ve formě řetězce, podle kterého vrací požadovanou informaci. Možné parametry jsou například následující.

parametrVýznam
xx-souřadnice myši
yy-souřadnice myši
knázev klávesy
tčas události
use Tk;

$m = MainWindow->new;
$m->configure(-width=>400, -height=>400);

$p = $m->Canvas(-cursor=>"crosshair", -width=>400, -height=>400, -background=>"white")->pack;

for($i=10; $i<200; $i+=10){
  $h=255/400*$i;
  $p->createRectangle($i, $i, 400-$i, 400-$i, -outline=>sprintf("#%02x%02x%02x", $h, $h, $h));
}
$status=$m->Label(-text=>"Klikni nekam do okna.")->pack();

$p->Tk::bind( "<Button-1>", [sub{$status->configure(
  -text=>"Klikl jsi na pozici [$_[1], $_[2]]")}, Ev("x"), Ev("y")]);
MainLoop;

Zajímavý je pro nás předposlední řádek. Jakmile klikneme levým tlačítkem někam do okna, vyvolá se událost <Button-1>. Protože jsme pomocí bind vytvořili k této události vazbu, dojde k provedení příslušné akce. Připomeňme, že, chceme-li akci předat parametry, musíme je vložit společně s odkazem na podprogram do pole.

Předchozí program vytvoří následující okno.

Zachycení události (kliknutí do prostoru okna) a výpis souřadnic kurzoru myši

Vyvolání více událostí zároveň

Podívejme se nyní na situaci, kdy uživatel vykonal dvojité kliknutí myši. Nastaly dvě události: <Button-1> a <Double-Button-1>. V takovém případě má přednost méně obecná událost, tedy v našem případě <Double-Button1>. To znamená, že po prvním kliknutí je okamžitě vyvolána událost <Button-1> a po druhém kliknutí už pouze <Double-Button-1>.

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ů

24.8.2016 6:44 /Ondřej Čečák
Poslední týden CFP LinuxDays 2016; pokud byste rádi přednášeli na LinuxDays 2016 8. a 9. října v Praze, můžete svůj příspěvek přihlásit, následovat bude veřejné hlasování.
Přidat komentář

9.8.2016 22:56 /Petr Ježek
Zařazení souborového systému reiser4 do jádra 4.7 znamená konečně konec patchování jádra jen kvůli možnosti použít reiser4.
Přidat komentář

12.7.2016 13:14 /František Kučera
Spolek OpenAlt zve na 130. distribuovaný sraz příznivců svobodného softwaru a otevřených technologií (hardware, 3D tisk, SDR, DIY, makers…), který se bude konat ve čtvrtek 21. července od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

11.7.2016 16:53 /Redakce Linuxsoft.cz
Konference LinuxDays hledá přednášející. Přihlášky poběží do konce prázdnin, v září bude hlasování a program. Více na https://www.linuxdays.cz/2016/cfp/.
Přidat komentář

8.5.2016 17:19 /Redakce Linuxsoft.cz
PR: Dne 26.5.2016 proběhne v Praze konference Cloud computing v praxi. Tématy bude např. nejnovější trendy v oblasti cloudu a cloudových řešení, cloudové služby, infrastruktura cloudu, efektivní využití cloudu, možné nástrahy cloudů a jak se jim vyhnout
Přidat komentář

21.4.2016 8:01 /František Kučera
Spolek OpenAlt zve na 127. distribuovaný sraz příznivců svobodného softwaru a otevřených technologií (hardware, 3D tisk, SDR, DIY, makers…), který se bude konat ve čtvrtek 28. dubna od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

2.3.2016 22:41 /Ondřej Čečák
Letošní ročník konference InstallFest již tento víkend!
Přidat komentář

14.2.2016 16:39 /Redakce Linuxsoft.cz
O víkendu 5. a 6. března 2016 proběhne na pražském Strahově 8. ročník tradiční konference InstallFest. Celkem za dva dny uvidíte ​30 přednášek​ a ​6 workshopů.
Přidat komentář

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

> Poslední diskuze

12.8.2016 11:51 / Josef Zapletal
Jak udělat HTML/Javascript swiping gallery do mobilu?

8.8.2016 14:58 / Adams
fairies for hire

28.7.2016 15:51 / pepan
Re: NetBeans vs Eclipse

10.6.2016 21:10 / pavel riha
FreeBSD 10.3 a virtualizace

8.6.2016 21:56 / Milan Gallas
Nevalidní prefix m

Více ...

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