我开始使用Gtk,我正在按照本教程如何制作第一个应用程序,但是当我尝试运行可执行文件时,我收到此错误:
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_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:Code :: Blocks,编译器:GNUC C编译器
如何解决这个问题?提前致谢.
解决方法
问题是在你的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.最好在gtk_builder_add_from_file调用中使用GError **参数.因此,不仅仅是gtk_builder_add_from_file使用以下代码供您参考:
GError *err = NULL; /* It is mandatory to initialize to NULL */ ... if(0 == gtk_builder_add_from_file (builder,&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表示您使用libglade格式来保存glade文件而不是GtkBuilder格式.因此,您可能需要在构建中链接libglade.但是从glade文件中你指出Gtk版本是2.16或更高版本,你可能需要使用GtkBuilder格式.在这种情况下,您需要转换为GtkBuilder格式,可以使用gtk-builder-convert
脚本或在Glade应用程序中打开glade文件.保存为GtkBuilder格式(此选项取决于您的Glade版本).希望这可以帮助!