Gtk-Critical **:gtk_widget_show断言GTK_IS_WIDGET(WIDGET)
我开始使用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 */ } 还有其他一些建议: 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: %sn",err->message); /* Your error handling code goes here */ } ... 2.在您的glade文件中,根元素glade-interface表示您使用libglade格式来保存glade文件而不是GtkBuilder格式.因此,您可能需要在构建中链接libglade.但是从glade文件中你指出Gtk版本是2.16或更高版本,你可能需要使用GtkBuilder格式.在这种情况下,您需要转换为GtkBuilder格式,可以使用 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |