【问题标题】:Gtk-Critical **: gtk_widget_show assertion GTK_IS_WIDGET(WIDGET)Gtk-Critical **: gtk_widget_show 断言 GTK_IS_WIDGET(WIDGET)
【发布时间】:2012-01-23 12:04:22
【问题描述】:

我开始使用 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_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:Code::Blocks,编译器:GNUC C 编译器

如何解决这个问题?提前致谢。

【问题讨论】:

    标签: c windows gtk


    【解决方案1】:

    问题在于您的林间空地文件中没有 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, "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 表示您正在使用 libglade 格式来保存您的 glade 文件,而不是 GtkBuilder 格式。因此,您可能需要在构建中链接libglade。但是从 glade 文件中你指出 Gtk 版本是 2.16 或更高版本,你可能需要使用GtkBuilder 格式。在这种情况下,您需要转换为GtkBuilder 格式,这可以使用gtk-builder-convert 脚本或在Glade 应用程序中打开glade 文件并以GtkBuilder 格式保存(此选项将取决于您的Glade 版本)。 希望这会有所帮助!

    【讨论】:

    • 非常感谢!祝你有美好的一天:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多