2012-01-23 14 views
6

Estoy comenzando con Gtk +, estoy siguiendo este tutorial sobre cómo hacer la primera aplicación, pero cuando intento ejecutar el ejecutable, aparece este error:Gtk-Critical **: gtk_widget_show assertion GTK_IS_WIDGET (WIDGET)

Gtk-Critical **: gtk_widget_show assertion GTK_IS_WIDGET(WIDGET) 

puedo ver en Google una gran cantidad de personas con el mismo error, pero no puedo ver la respuesta a cómo solucionar este problema ..

Mi Código C:

#include <stdlib.h> 
#include <gtk/gtk.h> 

GtkBuilder *builder; 
GtkWidget *app; 

G_MODULE_EXPORT 
void on_app_destroy (void) 
{ 
gtk_main_quit(); 
} 

G_MODULE_EXPORT 
void on_menu_quit_activate (void) 
{ 
gtk_main_quit(); 
exit(EXIT_SUCCESS); 
} 

int main (int argc, char *argv[]) 
{ 
/* Initialize GTK+ */ 
g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc) gtk_false, NULL); 
gtk_init (&argc, &argv); 
g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, g_log_default_handler, NULL); 

builder = gtk_builder_new(); 
gtk_builder_add_from_file (builder, "tut.glade", NULL); 
app = GTK_WIDGET (gtk_builder_get_object (builder, "app")); 
gtk_builder_connect_signals (builder, NULL); 

g_object_unref (G_OBJECT (builder)); 

/* Enter the main loop */ 
gtk_widget_show (app); 
gtk_main(); 
return 0; 
} 

contenta archivo:

<?xml version="1.0"?> 
<glade-interface> 
    <!-- interface-requires gtk+ 2.16 --> 
    <!-- interface-naming-policy project-wide --> 
    <widget class="GtkWindow" id="window1"> 
    <child> 
     <widget class="GtkFixed" id="fixed1"> 
     <property name="visible">True</property> 
     <child> 
      <widget class="GtkButton" id="button1"> 
      <property name="label" translatable="yes">button</property> 
      <property name="width_request">113</property> 
      <property name="height_request">42</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      </widget> 
      <packing> 
      <property name="x">149</property> 
      <property name="y">69</property> 
      </packing> 
     </child> 
     </widget> 
    </child> 
    </widget> 
    <widget class="GtkWindow" id="window2"> 
    <child> 
     <placeholder/> 
    </child> 
    </widget> 
</glade-interface> 

opciones de compilación:

`pkg-config --cflags --libs gtk+-2.0` -export-dynamic 

configuración del vinculador:

-export-dynamic 

Mi IDE: Code :: Blocks, compilador: GNUC compilador de C

cómo solucionar este problema? Gracias por adelantado.

Respuesta

8

El problema es que no hay ningún objeto cuyo ID es app en su archivo glade. Si desea visualizar la ventana, debe pasar la identificación asociada con la ventana, es decir, window1. Así que el código puede ser cambiado a:

app = GTK_WIDGET (gtk_builder_get_object (builder, "window1")); 
if (NULL == app) 
{ 
    /* Print out the error. You can use GLib's message logging */ 
    fprintf(stderr, "Unable to file object with id \"window1\" \n"); 
    /* Your error handling code goes here */ 
} 

Hay algunas otras sugerencias:
1. Es mejor utilizar GError ** parámetro en gtk_builder_add_from_file llamada. Así que en lugar de sólo gtk_builder_add_from_file utilizar el siguiente fragmento de código para su referencia:

GError *err = NULL; /* It is mandatory to initialize to NULL */ 
... 
if(0 == gtk_builder_add_from_file (builder, "tut.glade", &err)) 
{ 
    /* Print out the error. You can use GLib's message logging */ 
    fprintf(stderr, "Error adding build from file. Error: %s\n", err->message); 
    /* Your error handling code goes here */ 
} 
... 

2. A partir de su archivo claro, el elemento raíz glade-interface indica que está utilizando libglade formato de archivo que le ahorra claro en lugar de GtkBuilder formato. Por lo tanto, es posible que deba vincular libglade en la compilación. Pero desde el archivo Glade está indicando que la versión Gtk es 2.16 o superior, es posible que necesite usar el formato GtkBuilder. En ese caso, deberá convertir al formato GtkBuilder, que se puede hacer usando el script gtk-builder-convert o abrir el archivo glade en la aplicación Glade & guardando en el formato GtkBuilder (Esta opción dependerá de su versión Glade).
Espero que esto ayude!

+1

Thaanks mucho! que tengas un buen día :) – Jack