Německé servery Thomas-Krenn.AG

  • Sestavte si server v našem online konfigurátoru
  • Sestavy testovány s více než 30 operačními systémy
  • Nasazujeme Red Hat, CentOS, SUSE, Debian, Ubuntu
  • 98 % serverů  jsme schopni sestavit a dodat do 24 hodin
  • Každý server je před odesláním otestován
  • Technická podpora 24/7

Nabízíme rackové servery 1U, 2U, 3U/4U, Silent servery, virtualizační a storage & backup řešení.

Grafické komponenty v Ruby - Akce

GTK.jpg V dnešním díle budeme pokračovat úpravami programu a přiřadíme jednotlivým tlačítkům konkrétní akce. Také se podíváme na otázku zabezpečení aplikace proti chybám ze strany uživatele. Aplikace tedy začne pomalu ožívat a výsledkem bude téměř hotový program.


Stejně jako v běžném životě, i v programování je potřeba, aby před určitou reakcí předcházela nějaká akce. Tou může být kliknutí, pohyb myši, přetažení a mnohé další běžně prováděné operace. Připojení této reakce se provádí voláním metody signal_connect dané komponenty s parametrem udávajícím typ akce, např. kliknutí. Nic víc, nic míň.

Dál to vezměme postupně. Pomocí tlačítek Zdrojový adresář reps. Cílový adresář bychom chtěli vybrat vstupní resp. výstupní adresář s obrázky. K tomu použijeme standardní dialogová okna pro otevření souboru, ty se skrývají ve třídě Gtk::FileChooserDialog a připojíme je k těm správným tlačítkům.

sbutton.signal_connect("clicked") {
        dialog = Gtk::FileChooserDialog.new("Vyberte zdrojový adresář",
                                     @window,
                                     Gtk::FileChooser::ACTION_SELECT_FOLDER,
                                     nil,
                                     [Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_CANCEL],
                                     [Gtk::Stock::OPEN, Gtk::Dialog::RESPONSE_ACCEPT])
        dialog.current_folder = `echo $HOME`.chomp
        if dialog.run == Gtk::Dialog::RESPONSE_ACCEPT
                @sdirectory.text=dialog.filename
        end

        dialog.destroy
}

Upravený zdrojový soubor si opět můžete stáhnout. 2.rb

dbutton.signal_connect("clicked") {
        dialog = Gtk::FileChooserDialog.new("Vyberte cílový adresář",
                                     @window,
                                     Gtk::FileChooser::ACTION_SELECT_FOLDER,
                                     nil,
                                     [Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_CANCEL],
                                     [Gtk::Stock::OPEN, Gtk::Dialog::RESPONSE_ACCEPT])
        dialog.current_folder = `echo $HOME`.chomp
        if dialog.run == Gtk::Dialog::RESPONSE_ACCEPT
                @ddirectory.text=dialog.filename
        end

        dialog.destroy
}

Vybrání adresářeVybrání adresáře

Protože je program procházen směrem shora dolů, je nutno uvést předchozí metody až pod definice tlačítek dbutton a sbutton. Jinak program skončí chybovou hláškou.

Pokud jste se podívali na stránku s dokumentací ke třídě Gtk::FileChooserDialog, pak jste si jistě všimli že se naše část kódu podobá vzorovému kódu. Není to náhodou a jediné na co si musíte dát pozor je prováděná akce ACTION_SELECT_FOLDER, která se liší od běžnější ACTION_OPEN v tom, že uživateli umožní vybrat adresář.

Konstrukce `echo $HOME`.chomp používá jednoduchý příkaz shellu echo $HOME, pomocí něhož zjistí domovský adresář uživatele, který program spustil a použije ho jako výchozí adresář otevřený po zobrazení dialogu. Metoda chomp odstraňuje netisknutelné znaky (např. znak nového řádku), který by nám při nastavení aktuálního adresáře překážel.

Tím máme tlačítka Zdrojový/Cílový adresář nastavena a napojena na příslušná textová pole. Uživatel přitom může zadat umístění zdrojového a cílového adresáře také ručně. Tady si dovolím znovu trochu odbočit a podívat se na ošetření našeho programu proti chybám ze strany uživatele.

Neexistují hloupí uživatelé, ale pouze hloupě napsané aplikace, přesně takto by se dalo shrnout jednoduché pravidlo, kterým bychom se mohli dál řídit. Protože je zdrojový a cílový adresář jedním z míst, kde může uživatel ve spěchu či z nepozornosti udělat nějakou chybu, je jistě dobré tuto chybu předem předvídat a program na ní nějakým způsobem připravit.

Dalším slabým místem také může být chybně zadaný rozměr cílového obrázku nebo zdrojový adresář ve kterém není žádný obrázek. Ošetření těchto chyb ale už nechám na vás.

Vytvořme proto metodu check_before, která se provede po kliknutí na tlačítko Převést! a provede nutnou kontrolu správnosti zadání zdrojového a cílového adresáře. Tato metoda může vypadat třeba následovně:

def check_before 
        if @sdirectory.text.length < 1 || @ddirectory.text.length < 1
                error_window "Musíte zadat zdrojový a cílový adresář!"
                false
        elsif (not File.exist?(@sdirectory.text)) || (not File.exist?(@ddirectory.text))
                error_window "Takový zdrojový nebo cílový adresář neexistuje!"
                false
        else
                true
        end
end

Na tuto metodu se pak odkážeme po kliknutí na tlačítko Převést! následovně:

button.signal_connect("clicked") {

  if check_before then 
                # požadované akce po kliknutí na tlačítko
  end
}

Ještě se vraťme k metodě check_before, v ní totiž voláme jakousi metodu error_window, kterou musíme nejprve vytvořit. Tato metoda jednoduše použije třídu Gtk::MessageDialog obsahující přesně ta dialogová okna, které potřebujeme.

def error_window (message)
        dialog = Gtk::MessageDialog.new(@window, 
                                Gtk::Dialog::MODAL,
                                Gtk::MessageDialog::QUESTION,
                                Gtk::MessageDialog::BUTTONS_CLOSE,
                                message )
        dialog.run
        dialog.destroy
end

Volba MODAL zde přitom uvádí, že bude dialogové okno zobrazeno nad aktivním oknem a pomocí proměnné message tomuto oknu předáváme zobrazovaný text. Také si všimněte, že metoda check_before vrací hodnotu false (nepravda) resp. true (pravda) v závislosti na tom, zda testy proběhnou v pořádku. Tato návratová hodnota metody se uvádí na posledním řádku, který se provede.

Aby toho nebylo moc, nechejme si zbytek na příště. V příštím závěrečném díle se podíváme na to nejdůležitější, tím jsou akce prováděné po kliknutí na tlačítko Převést! a také si povíme něco málo o lokalizaci našeho programu do jiných jazyků.

Nahoru

Linuxová knihovnička - obchod.liberix.cz

Notebooky s Linuxem a bez operačního systému

(Jako ve škole)
 

Přidat názor

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích najdete v nápovědě.
Diskuzi můžete sledovat pomocí RSS kanálu rss



 
 
rss

Martin Šín

Martin Šín

Martin Šín (*1980) vystudoval pedagogickou fakultu a nyní pracuje jako učitel matematiky a výpočetní techniky na střední škole. Ve volném čase překládá a také hraje hry (ani jedno mu příliš nejde). V práci se snaží prosazovat open-source programy.


  • Distribuce: Debian
  • Hodnocení autora: ***

profil autora | proč linux


Blogy rss
Seriály
Martin Šín

Martin Šín, 29. srpen

Jak změnit Gnome na Windows 7

Chcete, aby vaše Gnome vypadalo jako Windows 7? Pak čtěte dál ..


Pavel Fric

Pavel Fric, 28. srpen

Tagaini Jisho

Nově je dostupný ke stažení překlad s přeloženými položkami filtru skupin: slovní druh, obor, nářečí,...


Václav Hejda

Václav Hejda, 23. srpen

Bounce - webová služba pro tvorbu, úpravu a sdílení screenshotů

Chtěli byste jednoduše pořizovat screenshoty webových stránek a sdílet je se svými přáteli? Vyzkoušejte...


Miroslav Hrončok

Miroslav Hrončok, 21. srpen

Kdybyste třeba nevěděli, co je to kahan

Přes prázdniny překládám vzdělávací programy KDE, jako je Kalzium, Rocs nebo Marble.


Pavel Fric

Pavel Fric, 18. srpen

nano

Ano


Všechny blogy »

Legální operační systém

Kniha Ubuntu 10.04 CZ
Top Multimediální centra