====== Accedere ai widget tramite gtkbuilder ====== Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//29/05/2015 - 10:59//** \\ \\ Andremo a vedere come accedere e manipolare i widget di una gui realizzata tramite glade con gtkbuilder in uno "scenario reale" . Per spiegazioni sul makefile vedere l'articolo [[programmazione:gtk:gui_glade_dentro_eseguibile]] . \\ \\ Come prima cosa occorre "estrarre" il puntatore al widget che vogliamo usare tramite la funzione ''mylabel=gtk_builder_get_object()'' in questo modo: mylabel=gtk_builder_get_object (xml,"label1" ); dove **xml** è il puntatore alla nostra gui glade creato con ''xml = gtk_builder_new()'' e **label1** è il nome del nostro widget. \\ Nel mio caso voglio semplicemente modificare il testo di una label al click su un button. Dunque ho messo la variabile globale ''mylabel'' in un header incluso sia nel main.c che in callbacks.c . Di seguito ecco il codice completo. ===== Codice ===== **main.c** #include //includo le librerie gtk e glade. #include "callbacks.h" GtkBuilder *xml; //questo è il puntatore al file xml che contiene l'interfaccia GtkWidget *widget; //questa variabile serve per recuperare di volta in volta il void on_MainWindow_delete_event(GtkWidget *widget, gpointer user_data) //altra callback associata alla chiusura della { // finestra gtk_main_quit(); } int main (int argc, char *argv[]) { gtk_init (&argc, &argv); GError* error = NULL; gchar* glade_file = g_build_filename(g_get_tmp_dir(),"gui.xml", NULL); // Copio il file dalla gui dalle risorse a una cartella temporanea // (le gtk+2 non possono caricare direttamente il file). GFile* mySRC = g_file_new_for_uri("resource:///org/myapp/res/gui.xml"); GFile* myDEST = g_file_new_for_path(glade_file); g_file_copy (mySRC, myDEST, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, &error); /*Infine carica come disolito il file dell'interfaccia */ xml = gtk_builder_new (); if (!gtk_builder_add_from_file (xml, glade_file, &error)) { g_warning ("Couldn't load builder file: %s", error->message); g_error_free (error); } mylabel=gtk_builder_get_object (xml,"label1" ); /* connette tutti gli eventi dei widget alle rispettive funzioni */ gtk_builder_connect_signals (xml, NULL); /* Avvia il ciclo principale delle gtAvvia il ciclo principale delle gtk*/ gtk_main (); return 0; } **callbacks.h** GtkLabel *mylabel ; void button1_clicked_cb(GtkWidget *widget, gpointer user_data) ; **callbacks.c** #include #include "callbacks.h" void button1_clicked_cb(GtkWidget *widget, gpointer user_data) { //Conta i click su un button in una label(mylabel) static gint count; gchar txt[40]; count++; g_sprintf(txt,"Cliccato %d volte\n",count ); gtk_label_set_text( mylabel, txt ); } ===== Il makefile ===== CPP = gcc OPTS = `pkg-config --cflags --libs gio-2.0 gtk+-2.0 gmodule-2.0` all: glib-compile-resources --generate-source resource.xml $(CPP) resource.c callbacks.c main.c -o main $(OPTS) clean: rm main