2012-01-23 7 views
6

Zaczynam z Gtk +, podążam za tutorialem jak zrobić pierwszą aplikację, ale kiedy próbuję uruchomić plik wykonywalny, pojawia się ten błąd:Gtk-Critical **: gtk_widget_show asercja GTK_IS_WIDGET (WIDGET)

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

widzę na google dużo ludzi z tego samego błędu, ale nie widzę uzyskaniu odpowiedzi, jak to naprawić ..

Moje kod 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; 
} 

zadowolony plik:

<?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> 

opcje kompilacji:

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

ustawienia Linker:

-export-dynamic 

Mój IDE: Code :: Blocks, kompilator: GNUC C Compiler

Jak rozwiązać ten problem? Z góry dziękuję.

Odpowiedz

8

Problem polega na tym, że nie ma obiektu, którego identyfikator to app w pliku polany. Jeśli chcesz wyświetlić okno, musisz przekazać identyfikator powiązany z oknem, tj. window1. W ten sposób kod może zostać zmienione na:

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 */ 
} 

Istnieje kilka innych propozycji:
1. Lepiej jest używać GError ** parametru gtk_builder_add_from_file rozmowy. Więc zamiast po prostu gtk_builder_add_from_file kliknąć na poniższy kawałek kodu dla odniesienia:

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. Z pliku polana, element główny glade-interface wskazuje, że używasz formatu libglade dla oszczędzając polana plik zamiast formatu GtkBuilder. W związku z tym konieczne może być połączenie libglade w kompilacji. Ale z pliku polany wskazujesz, że wersja Gtk to 2.16 lub wyższa, możesz potrzebować użyć formatu GtkBuilder. W takim przypadku musisz przekonwertować na format GtkBuilder, który można wykonać za pomocą skryptu gtk-builder-convert lub otwierając plik polany w aplikacji Polana & zapisując w formacie (Ta opcja będzie zależeć od wersji Glade).
Mam nadzieję, że to pomoże!

+1

Thaanks bardzo! miłego dnia :) – Jack