======Sviluppare con Libglade====== Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//20/04/2007//** Lib glade permette di caricare una interfaccia grafica con le librerie gtk++ a partire da un file xml, consente quindi di non ricompilare tutto il programma per una semplice modifica apportata all'interfaccia. In più non è necessario un programmatore per disegnare l'interfaccia e quindi il lavoro può essere distribuito tra più persone. La creazione del file xml esula dal compito di questo articolo, a breve comunque sarà disponibile un tutorial su glade. Cominciamo adesso con una serie di esempi commentati, riguardanti tutti i principali linguaggi di programmazione. ====C==== #include //includo le librerie gtk e glade. #include GladeXML *xml; //questo è il puntatore al file xml che contiene l'interfaccia GtkWidget *widget; //questa variabile serve per recuperare di volta in volta il // widget (ovvero l'oggetto ) che vogliamo usare void on_button1_clicked (GtkWidget *widget, gpointer user_data) //questa è una callback ovvero una funzione associata ad un evento { // per esempio la pressione di un pulsante widget = glade_xml_get_widget (xml, "entry1");//scrivo qualcosa nella entry gtk_entry_set_text (widget, "Ciao"); GtkWidget *window; window = gtk_dialog_new (); //crea una finestra di dialogo vuota GtkWidget *label = gtk_label_new ("Esempio di dialogo");//Crea una label gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),label, TRUE, TRUE, 0); //assegna la label alla finestra di dialogo gtk_widget_show (window); //mostra la finestra di dialogo gtk_widget_show (label); //mostra la label che sta sulla finestra } void on_window1_delete_event(GtkWidget *widget, gpointer user_data) //altra callback associata alla chiusura della { // finestra "window1" gtk_main_quit(); } int main (int argc, char *argv[]) { gtk_init (&argc, &argv); /* Carica l'interfaccia dal file di glade */ xml = glade_xml_new ("interfaccia.glade", NULL, NULL); /* connette tutti gli eventi dei widget alle rispettive funzioni */ glade_xml_signal_autoconnect(xml); /* Avvia il ciclo principale delle gtAvvia il ciclo principale delle gtk*/ gtk_main (); return 0; } /* Da compilare con: cc -o main main.c `pkg-config --cflags --libs libglade-2.0` -export-dynamic */ ==Compilazione== Adesso è possibile compilare il file tramite '' cc -o main main.c `pkg-config --cflags --libs libglade-2.0` -export-dynamic'' I flags per compilare il file vengono generati "al volo" dal programma pkg-config grazie al comando `pkg-config --cflags --libs libglade-2.0`, invece l'opzione -export-dynamic serve ad autoconnetere i vari componenti dell'interfaccia (bottoni, etichette etc...) alla relativa callbacks che porta quasi lo stesso nome es: on_[nome widget]_[tipo di evento] (GtkWidget *widget, gpointer user_data) . ====Python==== In Python si usa il pacchetto pygtk che contiene tutto quello che ci serve, anche i bindings per libglade. Nel codice di seguito importerò alcuni moduli che in realtà non servono per far funzionare lo script python, ma sono utili nel caso in cui si voglia creare un pacchetto indipendente compilato in bytecode con con "cx freeze", in modo tale che lo script funzioni pure nelle macchine in cui non sia installato python e le pygtk. #!/usr/bin/env python import pygtk #solo per creare il pacchetto indipendente import gtk import gtk.glade import atk #solo per creare il pacchetto indipendente import gtk._gtk #solo per creare il pacchetto indipendente import pango #solo per creare il pacchetto indipendente class Application: #crea la classe del mio programma def __init__(self): # e' il costruttore della classe self.widgetTree = gtk.glade.XML('interfaccia/interfaccia.glade') #file xml con il disegno della gui self.widgetTree.signal_autoconnect(self) #connette i segnali di click etc.. def on_frmMain_delete_event(self, widget, *args): #funzione per la chiusura della finestra gtk.main_quit() def on_cmdUno_clicked(self, widget, *args): #scrive ciao ciao C++ sulla textbox testo = self.widgetTree.get_widget('txtTesto') testo.set_text('Ciao ciao C++') def on_cmdDue_clicked(self, widget, *args): #scrive Ciao ciao Freepascal sulla textbox testo = self.widgetTree.get_widget('txtTesto') testo.set_text('Ciao ciao FreePascal + Lazarus') Application() # usa la classe sopra creata gtk.main() # avvia le gtk ====Perl==== #!/usr/bin/perl -w use Glib qw(TRUE FALSE); use Gtk2 '-init'; # '-init' significa che Gtk2->init viene richiamato all'inizio use Gtk2::GladeXML; use strict; use vars qw($main_window); sub ok_button_clicked { my (undef, undef) = @_; print "Hello world!.\n"; Gtk2->main_quit; } sub gtk_main_quit { Gtk2->main_quit; return TRUE; } # Inizializziamo le gtk #Gtk2->init; # carichiamo l'interfaccia dal file glade $main_window = Gtk2::GladeXML->new('interfaccia.glade'); #Connettiamo i segnali dell'interfaccia (o eventi) alle callbacks $main_window->signal_autoconnect_from_package('main'); # avviamo il ciclo principale delle gtk Gtk2->main; ====C++ e gtkmm==== Un altro modo di usare libglade è quello di usare il c++ con una una libreria chiamata gtkmm, in questo modo si può creare un programma orientato ad oggetti in C++ . #include #include #include using namespace std; void ok_button_clicked() { cout << "Hai cliccato." << endl; Gtk::Main::quit(); } int main (int argc, char *argv[]) { Glib::RefPtr main_window; Gtk::Main kit(argc, argv); // carico l'interfaccia main_window = Gnome::Glade::Xml::create("interfaccia.glade"); // connetto i segnali all'interfaccia Gtk::Button& ok_button = dynamic_cast( *main_window->get_widget("OKButton") ); ok_button.signal_clicked().connect( sigc::ptr_fun(&ok_button_clicked) ); // Avvia il ciclo principale ed esce quando chiudo la finestra Gtk::Dialog& dialog = dynamic_cast( *main_window->get_widget("MainWindow") ); //dialog.signal_delete_event().connect( sigc::ptr_fun(&Gtk::Main::quit) ); Gtk::Main::run( dialog ); //Gtk::Main::run( ); return 0; }