Gtk-Critical **:gtk_widget_show断言GTK_IS_WIDGET(WIDGET)

前端之家收集整理的这篇文章主要介绍了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 */
}

还有其他一些建议:
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版本).希望这可以帮助!

猜你在找的C&C++相关文章