Gtk2-Perl
Mureakuha
GTK (GIMP Toolkit) on kirjasto, jolla voi tehdä graafisia käyttöliittymiä. Lisenssinä toimii LGPL, joten voit kirjoittaa vapaita, ilmaisia tai kaupallisia ohjelmia ilman lisenssimaksuja.
Sitä kutsutaan GIMP toolkitiksi, koska se alun perin kirjoitettiin GIMP- kuvankäsittelyohjelman kehitystä varten. Nykyään GTK:ta käytetään monissa projekteissa, kuten GNOME-työpöytäympäristössä. GTK on rakennettu GDK:n (GIMP Drawing Kit) päälle.
Lähteenä käytetty: http://gtk2-perl.sourceforge.net/doc/gtk2-perl-tut/.
Sen ovat kirjoittaneet Emmanuele Bassi ja James Curbo. Lupa kääntämiseen pyydetty ja saatu.
Sisällysluettelo |
Asennus
Tarvittavat paketit voi hakea kirjaston kotisivuilta tai voit käyttää Linux-distrosi paketinhallintaa; Debianiin löytyy libgtk2-perl-paketti, jolla saa kirjaston suoraan toimimaan.
(testatkaa asentamista ja kirjoittakaa ohjeet)
Hello world
Ja sitten itse asiaan. Aloitetaan yksinkertaisimmalla ohjelmalla. Koodi luo yhden 200x200 pikselin kokoisen ikkunan, jota ei voi sulkea.
#!/usr/bin/perl -w use Gtk2; Gtk2->init; $window = Gtk2::Window->new('toplevel'); $window->show; Gtk2->main; 0;
Gtk2->init kutsuu init-metodia, jota kaikki GTK-ohjelmat kutsuvat. Sen kutsuminen asettaa muutaman asetuksen, kuten värikartan. Lisäksi se asettaa muutaman signaalinkäsittelijän ja tarkistaa seuraavat komentoriviargumentit.
- --gtk-module
- --g-fatal-warnings
- --gtk-debug
- --gtk-no-debug
- --gdk-debug
- --gdk-no-debug
- --display
- --sync
- --name
- --class
Se poistaa ne argumenttilistasta ja jättää sinne kaiken mitä se ei tunnista. Jos haluat, että sitä kutsutaan automaattisesti, kun kirjastoa ladataan käytä seuraavaa.
use Gtk2 '-init';
Ensin luodaan ikkuna. Show-metodi kertoo, että elementin asetukset on tehty ja se voidaan näyttää.
$window = Gtk2::Window->new('toplevel');
$window->show;
Tämä rivi aloittaa pääsilmukan GTK-ohjelmassa. Kun saavutaan tähän kohtaan, GTK odottaa tapahtumia, kuten napin painalluksia, ajastimia tai hiiren liikkeitä.
Gtk2->main;
Nyt lisätään ikkunaan nappi, jolla ikkunan voi sulkea.
#!/usr/bin/perl -w # Käytetään Glibin TRUE ja FALSE vakioita use Glib qw/TRUE FALSE/; use Gtk2 '-init'; sub hello { my ($widget, $window) = @_; print "Hello, World\n"; # tuhotaan ikkuna $window->destroy; } sub delete_event { print "delete_event signaali\n"; # Jos delete_event tapahtumankäsittelijä palauttaa FALSE, # GTK-aiheuttaa destroy-signaalin. TRUE-arvon palauttaminen # tarkoittaa, että ikkunaa ei haluta tuhota. Tämä on kätevää # esimerkiksi "Haluatko varmasti lopettaa"-dialogeissa. return TRUE; } # luodaan ikkuna $window = Gtk2::Window->new('toplevel'); # Asetetaan tapahtumankäsittelijä delete_event-tapahtumalle. # Tätä tapahtumankäsittelijää kutsutaan yleensä ikkunamanagerin # toimesta, esimerkiksi kun käyttäjä painaa [X]-nappia ikkunan # otsikossa $window->signal_connect(delete_event => \&delete_event); # Nyt asetetaan tapahtumankäsittelijä destroy:lle. Tätä kutsutaan, # kun kutsutaan Gtk2::Widget::destroy-metodia tai delete_event # palauttaa FALSE. Perl tukee nimettömiä aliohjelmia, joten kutsuttava # aliohjelma voidaan määritellä tässä. $window->signal_connect(destroy => sub { Gtk2->main_quit; }); # Asetetaan ikkunalle kymmenen pikselin reunus $window->set_border_width(10); # Luodaan uusi nappi tekstillä "Hello World" $button = Gtk2::Button->new("Hello World"); # Asetetaan napin painallukselle tapahtumankäsittelijä # parametrinä menee $button ja lisäksi laitetaan $window, # jotta sitä voidaan käsitella funktiossa $button->signal_connect(clicked => \&hello, $window); # Lisätään nappi ikkunaan $window->add($button); # Asetetaan nappi näkyväksi $button->show; # näytetään ikkuna $window->show; # Kaikkien GTK-ohjelmien pitää kutsua main()-metodia Gtk2->main; 0;
Signaalit
GTK-kirjasto perustuu tapahtumiin, joka tarkoittaa sitä, että se odottaa Gtk2::main()-funktiossa tapahtumia ja kutsuu sitten asiaankuulivia funktioita.
Funktioiden kutsuminen tapahtuu signaalien avulla. Kun saapuu tapahtumia niihin kytkettyjen signaalien perusteella kutsutaan funktioita. Kaikki ikkunaelementit perivät tietyt signaalit, kuten "destroy". Joillakin ikkunaelementeillä on omia signaaleita, kuten napeilla "clicked".
Saadaksemme napinpainalluksen tekemään jotakin, meidän täytyy asettaa tapahtumankäsittelijä painallukselle, jolloin kutsutaan funktiota kun nappia painetaan. Se tapahtuu käyttämällä funktiota kuten:
unsigned Glib::Object->signal_connect( $widget,
$name,
$func,
$data=undef );
Ensimmäinen parametri on elementti, jolle määritellään käsittelijää. Toinen on signaalin nimi. Kolmas on kutsuttava funktio. Neljäs on vaihtoehtoinen parametri kutsuttavalle funktiolle.
sub callback_func
{
my ($widget, $data) = @_;
$widget->method( $param );
#...
}
Voit käyttää myös nimettömiä aliohjelmia.
$instance->signal_connect($signal_name => sub {
# ...
});
Älä kuitenkaan käytä nimettömiä aliohjelmia pitkille tai monimutkaisille toiminnoille, koska se vähentää koodin luettavuutta.
Kun käytät nimettömiä aliohjelmia voit käyttää kaikkia lohkossa näkyviä muuttujia, joten seuraavanlainen
$some_object->some_method();
$other_object->signal_connect($signaali => sub {
# ...
$some_object->some_other_method();
});
Asemointi
Luodessasi ohjelmaa, haluat laittaa useampia elementtejä yhteen ikkunaan. Ensimmäisessä esimerkissä käytettiin vain yhtä elementtiä, joten voitiin yksinkertaisesti kutsua gtk_container_add()-funktiota "pakkaamaan" (pack) elementti ikkunaan. Mutta kun haluat useamman elementin samaan ikkunaan, sinun täytyy asemoida ikkunaelementit laatikoilla.
Pakkaaminen tehdään yleensä laatikoilla. Laatikot ovat näkymättömiä säiliöitä, jotka voivat sisältää ikkunaelementtejä. Laatikoita on horisontaalisia ja vertikaalisia. Horisontaaliseen laatikkoon voi laittaa elementtejä vasemmalta oikealle, tai päinvastoin, riippuen kutsusta. Voit käyttää laatikoita laatikoiden sisällä luodaksesi haluamasi järjestyksen.
Horisontaalinen laatikko luodaan kutsumalla metodia Gtk2::HBox::new() ja vertikaalinen kutsumalla metodia Gtk2::VBox::new(). Metodeita Gtk2::Box::pack_start() ja Gtk2::Box::pack_end() käytetään elementtien lisäämiseen laatikoihin. pack_start() aloittaa elementtien lisäämisen ylhäältä alas vboxissa ja vasemmalta oikealle hboxissa. Näiden metodien avulla voimme tasata elementit vasemmalle tai oikealle ja käyttää niitä sekaisin saadaksemme haluamamme lopputuloksen.
Käyttämällä näitä kutsuja GTK tietää mihin haluat sijoittaa elementit, joten se voi automaattisesti suurentaa ja pienentää niitä tarpeen mukaan. Voit myös käyttää monia asetuksia elementtien sijoitteluun tarkemmin.


