Perl (121) - Wx - události
Druhá polovina tutoriálu o wxPerl obsahuje především návod, jak pracovat s událostmi. Jeho aplikace je ukázána na práci s menu.
30.11.2010 00:00 |
Jiří Václavík
| Články autora
| přečteno 2847×
Zásadní nevýhodou je, že nám tlačítko vytvořené v předchozí aplikaci nefunguje tak, jak má. Dále se podíváme, jak ho pomocí správy událostí zprovoznit.
wxPerl funguje tak, že nastavuje tzv. konektory pro řízení událostí. To znamená, že pro každý typ události zde máme funkci, která nám ji obslouží.
Upravme náš program tak, aby se po kliknutí na tlačítko aplikace uzavřela. Budeme tedy chtít volat funkci exit, jakmile uživatel tlačítko stiskne.
To obnáší tři jednoduché věci.
- zavést modul Wx::Event
- napojit událost (v našem případě stisk tlačítka) na někakou metodu, která se provede
- napsat tuto metodu
Nás bude nyní zajímat zejména funkce EVT_BUTTON pro obsluhu tlačítek. Proto ji importujeme do třídy FrameSTlacitkem.
use Wx::Event qw(EVT_BUTTON);
Uvnitř konstruktoru ji zavoláme a napojíme pomocí ní naše tlačítko $button na podprogram konec, který v zápětí napíšeme.
EVT_BUTTON($self, $button, \&konec);
Celkem jsme tedy modifikovali třídu FrameSTlacitkem do následující podoby. Vše ostatní zůstává stejné.
package FrameSTlacitkem;
use Wx::Event qw(EVT_BUTTON);
use base "Wx::Frame";
sub new {
my $ref = shift;
my $self = $ref->SUPER::new(@_);
my $panel = Wx::Panel->new($self,-1,);
my $button = Wx::Button->new($panel, -1, "Zavrit", [10, 10], [-1, -1]);
EVT_BUTTON( $self, $button, \&konec );
return $self;
}
sub konec {exit;}
Jakmile nyní spustíme aplikaci a stiskneme tlačítko, vyvolá se událost a protože ji máme pomocí EVT_BUTTON napojenou na funkci konec, program skončí.
Menu - praktická ukázka použití událostí
Ukažme si, jak v aplikaci vyrobit klasické menu. Budeme postupovat velice podobně jako doposud.
Balík main bude vypadat opět stejně.
#!/usr/bin/perl -w
use strict;
use Wx;
package main;
my $app = MojeAplikace->new;
$app->MainLoop;
Balík MojeAplikace se v podstatě také příliš lišit nebude.
package MojeAplikace;
use base "Wx::App";
sub OnInit {
my $frame = FrameSMenu->new(undef, -1, "Prvni aplikace", [-1000, -1000], [400, 300]);
$frame->Show(1);
}
Zbývá nám napsat konstruktor balíku FrameSMenu. Opět samozřejmě dědíme od Wx::Frame.
package FrameSMenu;
use base "Wx::Frame";
sub new {
my $ref = shift;
my $self = $ref->SUPER::new(@_);
#zde napíšeme menu
return $self;
}
A konečně můžeme psát to, proč to celé děláme. Vytvoření menu obnáší následující.
- Vytvoření menubaru (to je obvyklý pruh nabídek, který je při běhu aplikace stále vidět)
- Vytvoření jednotlivých nabídek a jejich vložení do menubaru
- Aktivování menubaru
- (Dále lze pro různé položky nabídek v menu vytvářet akce)
Začněme druhým krokem. Vytvoříme si pro ukázku dvě nabídky. Nabídku vytvoříme standardním Wx::Menu a poté do ní pomocí metody Append přidáváme položky a případně pomocí AppendSeparator vkládáme oddělovače.
Dále je možné používat AppendCheckItem a AppendRadioItem pro checkbuttony a radiobuttony. Taktéž lze vytvářet submenu pomocí AppendSubMenu (to obnáší vytvoření nabídky pomocí Wx::Menu, pro kterou poté pomocí AppendSubMenu vytvoříme položku v menu).
Standardní nabídka Soubor může vypadat například nějak takto.
my $menu1 = Wx::Menu->new();
$menu1->Append(1, "&Otevrit\tC-o","Otevrit");
$menu1->Append(2, "&Ulozit\tC-s","Ulozit");
$menu1->AppendSeparator();
my $menu_konec = $menu1->Append(-1, "&Konec\tC-x","Konec");
Pro komplexnější představu si vytvořme ještě nabídku Nápověda.
my $menu2 = Wx::Menu->new();
$menu2->Append(4, "&O programu","O programu");
Tímto je druhý krok hotov. Ještě jsme nevytvořili menubar, což učiníme právě teď. Menubar je schován v třída Wx::MenuBar a metodou Append do něj vkládáme již existující nabídky. Použití je tedy v našem případě následující.
my $menubar = Wx::MenuBar->new();
$menubar->Append($menu1, "&Soubor");
$menubar->Append($menu2, "&Napoveda");
Zbývá nám aktivovat menubar. K tomu máme metodu SetMenuBar.
$self->SetMenuBar($menubar);
Nyní bychom samozřejmě měli jednotlivým položkám v menu přiřadit nějakou činnost. Ukažme si, jak bychom rozchodili položku Konec v nabídce Soubor.
Nejprve je třeba importovat potřebné akce z Wx::Event. To se udělá stejně jako jsme to dělali u akcí pro tlačítka. Importujme tedy EVT_MENU.
use Wx::Event qw(EVT_MENU);
A nyní již jen přímočaře voláme EVT_MENU a definujeme požadovanou akci.
EVT_MENU($self, $menu_konec, sub{$_[0]->Close(1)});
Celý balík FrameSMenu tedy vypadá takto.
package FrameSMenu;
use Wx::Event qw(EVT_MENU);
use base "Wx::Frame";
sub new {
my $ref = shift;
my $self = $ref->SUPER::new(@_);
my $menu1 = Wx::Menu->new();
$menu1->Append(1, "&Otevrit\tC-o","Otevrit");
$menu1->Append(2, "&Ulozit\tC-s","Ulozit");
$menu1->AppendSeparator();
my $menu_konec = $menu1->Append(-1, "&Konec\tC-x","Konec");
my $menu2 = Wx::Menu->new();
$menu2->Append(4, "&O programu","O programu");
my $menubar = Wx::MenuBar->new();
$menubar->Append($menu1, "&Soubor");
$menubar->Append($menu2, "&Napoveda");
$self->SetMenuBar($menubar);
EVT_MENU($self, $menu_konec, sub{$_"[0]->Close(1)});
return $self;
}
Po spuštění lze spatřit náš výtvor.
Takto vypadá naše menu
Informativní okno
Rozšiřme ještě předchozí příklad a zprovozněme položku O programu v druhé nabídce našeho menu. Chceme, aby po kliknutí na tuto položku vyskočilo nějaké okno se zprávou.
Nejprve tedy standardně vytvoříme v konstruktoru akci.
EVT_MENU($self, 4, \&oprogramu);
A následně již stačí jen vytvořit podprogram oprogramu. Zprávu zobrazíme intuitivním použitím widgetu Wx::MessageBox.
sub oprogramu {
my $self = shift;
Wx::MessageBox("Toto je ukazkovy program", "O programu", "", $self);
}
Takto bude vypadat popup okno.
Informativní okno Wx::MessageBox
Verze pro tisk
| |
|
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ů
19.6.2013 6:43 /MaReK Olšavský Svobodný operační systém Contiki nepatří mezi běžně známý software. Výrobce LED „žárovek“ se rozhodl jím osadit výrobky, včetně WiFi konektivity a osvětlení tak bude možné ovládat z chytrého telefonu.
Přidat komentář
19.6.2013 6:43 /MaReK Olšavský Začíná se vyjasňovat v budoucnosti ARMu u AMD. První mikroprocesory by měly být v prodeji v prvním čtvrtletí 2014, jako nástupce současné řady Opteron X. Pokud ale nenabídnou výrazně vyšší výkon, či výrazně menší spotřebu, asi jen největší nadšenci najdou důvod pro přechod od rozšířené a osvědčené platformy x86.
Přidat komentář
18.6.2013 7:01 /MaReK Olšavský Ač se to zdá neuvěřitelné, případ SCO vs. IBM je otevřený. Znovu jej otevřel soud v Utahu, na žádost ještě stále „kopající“ SCO Group. O výsledku případu je těžké polemizovat. Kolem Linuxu se točí velké množství peněz a kdyby dovedlo SCO vybírat poplatky jen za komerční nasazení, možná by mělo příjmy srovnatelně s Red Hatem.
Přidat komentář
18.6.2013 7:01 /MaReK Olšavský Přehrávač Songbird, vyvíjený nad jádrem Gecko, nikdy výrazně neprosadil a od roku 2010 není vyvíjen pro Linux. Eric Wirttman oznámil ukončení projektu k 28. červnu. Zvedne někdo hozenou rukavici, nebo skončí Songbird na smetišti zapomenutých projektů?
Komentářů: 2
17.6.2013 6:54 /MaReK Olšavský Velký přínos pro tržní podíl MariaDB bude znamenat Red Hat Enterprise Linux, který je dalším řadě distribucí přecházejících od MySQL na MariaDB. Vývojáři MariaDB získají, díky síle Red Hatu, významnou pozici na trhu databází.
Komentářů: 1
17.6.2013 6:54 /MaReK Olšavský Nedlouho po vydání Debianu 7 vychází upgradovaný Debian 7.1, který přináší bezpečnostní opravy. Vydání je určené jen pro prvotní instalaci, updaty z repozitářů již problémy řešily.
Přidat komentář
14.6.2013 7:16 /MaReK Olšavský Příjemnou zprávou ze sousedního Německa je oficiální odmítání softwarových patentů v německém parlamentu (Bundestagu). Při síle Německa v EU a světě jde o výrazný posun na cestě k jejich zabránění. Méně příjemnou je zamítnutí přechodu Berlína na GNU/Linux (alespoň prozatím, třeba se časem ledy pohnou).
Přidat komentář
13.6.2013 7:13 /MaReK Olšavský Jim Whitehurst, CEO Red Hatu, vysvětloval na Red Hat Summitu, že svobodný software není jen o ceně, ale především je hlavním nositelem inovací. Mnoho zajímavých inovací určitě přinese i připravovaný RHEL 7, ale desktopové uživatele bude nejspíše nejvíce zajímat změna desktopu na GNOME 3 Classic mode.
Přidat komentář
Více ...
Přidat zprávičku
 Poslední diskuze
19.6.2013 6:19 /
MaReK Olšavský Dement
19.6.2013 5:38 /
MaReK Olšavský Re: ???
18.6.2013 22:21 /
Petr Ježek ???
17.6.2013 18:24 /
Karel Belunek Super!!!
16.6.2013 14:32 /
Petr Ježek jeden ztratil
Více ...
|