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

> Perl (121) - Wx - události

Perl 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

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ů

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 ...

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