Gtk-Critical **: утверждение gtk_widget_show GTK_IS_WIDGET (WIDGET) - PullRequest
7 голосов
/ 23 января 2012

Я начинаю с Gtk +, я следую этому уроку, как создать первое приложение, но когда я пытаюсь запустить исполняемый файл, я получаю эту ошибку:

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

Я вижу наGoogle много людей с той же ошибкой, но я не вижу ответа, как это исправить ..

Мой код 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: Код :: Блоки, компилятор: Компилятор GNUC C

Какпочини это?Заранее спасибо.

1 Ответ

11 голосов
/ 23 января 2012

Проблема в том, что в вашем файле glade нет объекта с идентификатором app. Если вы хотите отобразить окно, вы должны передать идентификатор, связанный с окном, т.е. 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).
Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...