2012-01-23 14 views
6

मैं जीटीके + के साथ शुरू कर रहा हूं, मैं इस ट्यूटोरियल का पालन कर रहा हूं कि पहला एप्लिकेशन कैसे बनाया जाए, लेकिन जब मैं निष्पादन योग्य चलाने की कोशिश करता हूं, तो मुझे यह त्रुटि मिलती है:जीटीके-क्रिटिकल **: gtk_widget_show assertion GTK_IS_WIDGET (WIDGET)

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

मैं गूगल पर एक ही त्रुटि के साथ बहुत से लोगों को देख सकते हैं, लेकिन मैं इसे ठीक करने के साथ जबाब नहीं देख सकते हैं ..

मेरे सी कोड:

#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 

मेरे आईडीई: कोड :: ब्लाकों, संकलक: GNUC सी संकलक

कैसे इसे ठीक करने के लिए? अग्रिम में धन्यवाद।

उत्तर

8

समस्या यह है कि कोई ऐसी वस्तु नहीं है जिसकी आईडी आपकी glade फ़ाइल में app है। यदि आप विंडो को प्रदर्शित करना चाहते हैं, तो आपको विंडो से जुड़े आईडी को पास करना होगा i.e. window1
1. यह gtk_builder_add_from_file कॉल में GError ** पैरामीटर का उपयोग करने के लिए बेहतर है:

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

कुछ अन्य सुझाव हैं: इस प्रकार आप कोड को बदला जा सकता है। तो बस 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 फ़ाइल से, मूल तत्व glade-interface इंगित करता है कि आप आप GtkBuilder प्रारूप के बजाय Glade फ़ाइल को सहेजने के लिए libglade प्रारूप का उपयोग कर रहे हैं। इस प्रकार आपको निर्माण में libglade लिंक करने की आवश्यकता हो सकती है। लेकिन ग्लैड फ़ाइल से आप संकेत दे रहे हैं कि जीटीके संस्करण 2.16 या इससे ऊपर है, तो आपको GtkBuilder प्रारूप का उपयोग करने की आवश्यकता हो सकती है। उस स्थिति में आपको GtkBuilder प्रारूप में परिवर्तित करने की आवश्यकता होगी जिसे gtk-builder-convert स्क्रिप्ट का उपयोग करके किया जा सकता है या में ग्लेड फ़ाइल GtkBuilder प्रारूप में सहेजने वाली ग्लेड फ़ाइल खोलने के लिए किया जा सकता है (यह विकल्प आपके ग्लैड संस्करण पर निर्भर करेगा)।
आशा है कि इससे मदद मिलती है!

+1

बहुत धन्यवाद! आपका दिन शुभ हो :) – Jack

संबंधित मुद्दे