====== Introduzione alla librerie Gtk2 con Perl ====== Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//30/01/2015 - 15:20//** \\ \\ Perl è un ottimo linguaggio di programmazione interpretato, utilissimo in tutti quei casi in cui è necessario scrivere un programma che deve essere continuamente corretto o modificato. In questo articolo mostreremo come realizzare uno script grafico tramite le librerie Gtk2 . \\ Lo script di seguito mostrera' una finestra con una griglia che fungera' da semplice rubrica. Saranno disponibili i comandi per aggiungere, eliminare e modificare le varie righe della griglia. \\ Per ulteriori approfondimenti e' disponibile il [[http://gtk2-perl.sourceforge.net/doc/|Manuale]]. {{:programmazione:perl:perl-gtk-intro0.png?450|}} ===== Il codice ===== E' da notare che in questo script si fa uso del widget **Gtk2::SimpleList** che semplifica notevolmente la creazione di griglie basate su GtkTreeView. **rubrica.pl** #!/usr/bin/perl use Glib qw/TRUE FALSE/; use Gtk2 '-init'; use Gtk2::SimpleList; #Le callbacks dei bottoni sub exit { my ($widget, $window) = @_; $window->destroy; } sub delete_event { $window->destroy; return TRUE; } sub add { my ($widget, $window) = @_; #Aggiungo una riga (tratto $slist come un normalisimo array) push @{$slist->{data}}, [ $txtNome->get_text,$txtCognome->get_text, $txtEmail->get_text ]; } sub del { #Prende l'indice selezionato e cancella la riga @sel = $slist->get_selected_indices; splice @{ $slist->{data} }, @sel[0], 1; clearText();#svuota le entry } sub get { #Prende l'indice selezionato e visualizza i dati nelle entry @sel = $slist->get_selected_indices; #riga selezionata, colonna 0,1,2... $txtNome->set_text($slist->{data}[@sel[0]][0]); $txtCognome->set_text($slist->{data}[@sel[0]][1]); $txtEmail->set_text($slist->{data}[@sel[0]][2]); } sub save { #Prende l'indice selezionato e visualizza i dati nelle entry @sel = $slist->get_selected_indices; #riga selezionata, colonna 0,1,2... $slist->{data}[@sel[0]][0]=$txtNome->get_text; $slist->{data}[@sel[0]][1]=$txtCognome->get_text; $slist->{data}[@sel[0]][2]=$txtEmail->get_text; clearText();#svuota le entry } sub clearText { #Questa funzione cancella soltanto il contenuto delle entry $txtNome->set_text(''); $txtCognome->set_text(''); $txtEmail->set_text(''); } # crea la finestra principale e la collega ad alcune callback $window = Gtk2::Window->new('toplevel'); $window->signal_connect(delete_event => \&delete_event); $window->signal_connect(destroy => sub { Gtk2->main_quit; });#alla chiusura quit # Alcune prprietà della finestra $window->set_border_width(10); $window->set_size_request(640, 600); $window->set_title("Rubrica"); $window->set_position('center'); #Entry e label per l'inserimento e modifica $txtNome = Gtk2::Entry->new(); $txtCognome = Gtk2::Entry->new(); $txtEmail = Gtk2::Entry->new(); $lblNome = Gtk2::Label->new ("Nome:"); $lblCognome = Gtk2::Label->new ("Cognome:"); $lblEmail = Gtk2::Label->new ("Email:"); #Bottoni per le azioni $btnDel = Gtk2::Button->new("Elimina"); $btnExit = Gtk2::Button->new("Esci"); $btnAdd = Gtk2::Button->new("Aggiungi"); $btnSave = Gtk2::Button->new("Salva"); #Callbacks bottoni $btnExit->signal_connect(clicked => \&exit, $window); $btnAdd->signal_connect(clicked => \&add, $window); $btnDel->signal_connect(clicked => \&del, $window); $btnSave->signal_connect(clicked => \&save, $window); #Colonne della griglia e relativo tipo $slist = Gtk2::SimpleList->new ( 'Nome' => 'text', 'Cognome' => 'text', 'email' => 'text', ); #Inserisco una riga (tratto $slist come un normalisimo array) @{$slist->{data}} = ( [ 'Fabio','Di Matteo','myemail@mail.com' ], [ 'Tizio','Di Matteo','myemail@mail.com' ], [ 'Caio','Di Matteo','myemail@mail.com' ], ); #Dimensioni della griglia $slist->set_size_request(400,400); #Al doppioclick su una riga esegui la funzione "get" $slist->signal_connect(row_activated => \&get, $window); $hbox0 = Gtk2::HBox->new(); #contenitore dell'intera area $vbox0 = Gtk2::VBox->new(); #contenitore griglia e bottoni $vbox1 = Gtk2::VBox->new(); #contenitore caselle di testo ed etichette #Aggiungo ad hbox0 gli altri contenitore vbox0 e vbox1 $hbox0->pack_start($vbox0, TRUE, FALSE, 0); $hbox0->pack_start($vbox1, TRUE, FALSE, 0); #Aggiungo al cntenitore vbox1 i vari campi testo con le relative etichette $vbox1->pack_start($lblNome, FALSE, TRUE, 0); $vbox1->pack_start($txtNome, FALSE, TRUE, 0); $vbox1->pack_start($lblCognome, FALSE, FALSE, 0); $vbox1->pack_start($txtCognome, FALSE, FALSE, 0); $vbox1->pack_start($lblEmail, FALSE, FALSE, 0); $vbox1->pack_start($txtEmail, FALSE, FALSE, 0); #Aggiungo al contenitore vbox0 la griglia e i bottoni sotto di essa $vbox0->pack_start($slist, TRUE, FALSE, 0); $vbox0->pack_start($btnAdd, TRUE, FALSE, 0); $vbox0->pack_start($btnSave, TRUE, FALSE, 0); $vbox0->pack_start($btnDel, TRUE, FALSE, 0); $vbox0->pack_start($btnExit, TRUE, FALSE, 0); # Aggiungo box0 a $window $window->add($hbox0); # mostra tutto $window->show_all; #Ciclo principale delle Gtk Gtk2->main; 0;