2012-01-23 24 views
6

我開始使用Gtk +,我正在學習如何製作第一個應用程序,但是當我嘗試運行可執行文件時,出現此錯誤:Gtk-Critical **:gtk_widget_show assertion GTK_IS_WIDGET(WIDGET)

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

我可以在谷歌看到很多人有同樣的錯誤,但我不能看到如何解決這個問題的答覆..

我的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; 
} 

高興文件:

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

編譯選項:

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

連接器設置:

-export-dynamic 

我的IDE:代碼::塊,編譯器:GNUC C編譯器

如何解決這一問題?提前致謝。

回答

8

問題是您的glade文件中沒有對象的ID爲app。如果要顯示窗口,則必須傳遞與該窗口關聯的ID,即window1。因此,你的代碼可以改爲:

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

很少有其他建議:
1.這是更好地使用GError **參數gtk_builder_add_from_file通話。因此,而不是隻是gtk_builder_add_from_file使用下面的一段代碼,供您參考:

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.從林間空地文件,根元素glade-interface表明您正在使用libglade格式保存你的,而不是GtkBuilder格式空地文件。因此,您可能需要在構建中鏈接libglade。但是,從林間空地文件要表示基於GTK的版本是2.16或以上,你可能需要使用GtkBuilder格式。在這種情況下,你將需要轉換爲GtkBuilder格式可使用gtk-builder-convert腳本或打開在GtkBuilder格式保存(此選項將取決於您的格萊德版)格萊德應用&林間空地文件來完成。
希望這有助於!

+1

Thaanks很多!祝你今天愉快 :) – Jack

相關問題