LINUX.ORG.RU

gtk_notebook ошибка


0

1

Изучаю gtk+. Решил поиграться c виджетом gtk_notebook(контейнер для элементов, со вкладками). Накидал в glade окно, меню и gtk_notebook. Зафигачил сей код:

#include <gtk/gtk.h>
#define UIFILE "test.glade"

int window_destroy (GtkWidget *window)
{
  gtk_main_quit ();
  return 0;
}

int main (int argc, char** argv)
{
  gtk_init (&argc, &argv);
  GtkBuilder *builder;
  GtkWidget *window;
  //GtkWidget *notebook;
  builder = gtk_builder_new ();
  gtk_builder_add_from_file (builder, UIFILE, NULL);
  window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
  //notebook = GTK_WIDGET (gtk_builder_get_object (builder, "notebook1"));
  g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (window_destroy), NULL);
  g_object_unref(G_OBJECT (builder));
  gtk_widget_show (window);
  gtk_main();
  return 0;
}

Но вместо ожидаемого окна программа выводит следующее:
**
Gtk:ERROR:/build/buildd-gtk+2.0_2.20.1-2-i386-TNeM25/gtk+2.0-2.20.1/gtk/gtknotebook.c:1148:gtk_notebook_buildable_add_child: assertion failed: (page != NULL)
Аварийный останов

В чем проблема?

★★

В чем проблема?

Изучаешь gtk на не том языке.

И еще, видимо, в криво составленном glade файле.

baverman ★★★
()
Ответ на: комментарий от netcat

Gtk+ на С написан.

И? Нужна тебе эта куча сисизмов? Вместо, действительного изучения библиотеки, сигналы, события, модель отрисовки, иерархия объектов, лейауты, модели для представления списков и т.д... Будешь наяривать байтики, короче, за деревьями из «Си» не будешь видеть леса.

Так, к слову, закончил недавно писать аналог стандартного GtkIconView, только с горизонтальным скроллингом. На си реализация занимает 7200 cloc, на чистом питоне 195. Какого? А?

baverman ★★★
()

> g_object_unref(G_OBJECT (builder));

так хочется unref-ить - unref-ь после gtk_main ();

ananas ★★★★★
()
Ответ на: комментарий от baverman

> аналог стандартного GtkIconView, только с горизонтальным скроллингом

а зачем? пересчитывать при изменении размера и задавать нужное количество колонок через gtk_icon_view_set_columns() - реализация значительно меньше займет

ananas ★★★★★
()
Ответ на: комментарий от ananas

а зачем?

пересчитывать при изменении размера и задавать нужное количество колонок через gtk_icon_view_set_columns()

Первоначально я так и хотел сделать, но потом под руку подвернулся ExoIconView от thunar с нужным функционалом и готовыми привязками. В итоге привязки оказались сырыми — сегфолт при попытке скрольнуться на элемент и не обернулся get_cursor. В общем, на этой волне захотелось пройти до конца. И, как несомненный плюс, узнал много нового, что очень неплохо.

baverman ★★★
()
Ответ на: комментарий от ananas

Покопался в glade-файле, вроде все правильно. Вот, выкладываю:

<?xml version="1.0"?>
<interface>
  <requires lib="gtk+" version="2.16"/>
  <!-- interface-naming-policy project-wide -->
  <object class="GtkWindow" id="window">
    <child>
      <object class="GtkNotebook" id="notebook1">
        <property name="visible">True</property>
        <property name="can_focus">True</property>
        <child>
          <placeholder/>
        </child>
        <child type="tab">
          <object class="GtkLabel" id="label1">
            <property name="visible">True</property>
            <property name="label" translatable="yes">page 1</property>
          </object>
          <packing>
            <property name="tab_fill">False</property>
          </packing>
        </child>
        <child>
          <placeholder/>
        </child>
        <child type="tab">
          <object class="GtkLabel" id="label2">
            <property name="visible">True</property>
            <property name="label" translatable="yes">page 2</property>
          </object>
          <packing>
            <property name="position">1</property>
            <property name="tab_fill">False</property>
          </packing>
        </child>
        <child>
          <placeholder/>
        </child>
        <child type="tab">
          <object class="GtkLabel" id="label3">
            <property name="visible">True</property>
            <property name="label" translatable="yes">page 3</property>
          </object>
          <packing>
            <property name="position">2</property>
            <property name="tab_fill">False</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>


Какие еще есть идеи?

netcat ★★
() автор топика
Ответ на: комментарий от netcat

Какие еще есть идеи?

~$ glade-previewer -f /tmp/wow.glade 

(process:22348): GLib-WARNING **: goption.c:2132: ignoring no-arg, optional-arg or filename flags (48) on option of type 4

(process:22348): GLib-WARNING **: goption.c:2132: ignoring no-arg, optional-arg or filename flags (32) on option of type 1
GladeUI-Message: No displayable values for property GtkMessageDialog::message-type
**
Gtk:ERROR:gtknotebook.c:1213:gtk_notebook_buildable_add_child: assertion failed: (page != NULL)
Aborted

Ты думаешь, я просто так про файл буркнул? Попытайся догадаться, почему не работает. Сопоставь содержимое с «assertion failed: (page != NULL)».

Если Ананас-добрая душа до завтра не ответит и сам не допрешь, тогда дам конкретный ответ.

baverman ★★★
()

патаму что ты удалил окно вместе с builderом!!!!!

в мануале на GtkBuilder (его стоило прочитать) написано, что он держит ссылки на все созданные элементы и после g_object_unref(G_OBJECT (builder)); следующий же вызов получает на вход ссылку на мусорную область памяти

ckotinko ☆☆☆
()
Ответ на: комментарий от baverman

> Если Ананас-добрая душа до завтра не ответит

да ладно издеваться над ребенком. тс - заполни placeholder-ы

btw, а на 2.24 ругани нет

ananas ★★★★★
()
Ответ на: комментарий от ananas

glade-previewer - это в 3.10 такая фишка опять появилась?

Да.

baverman ★★★
()
Ответ на: комментарий от netcat

Как уже заметил Ананас, у тебя в глейд файле сделаны вкладки, но дочерние виджеты в них не всунуты. У тебя два варианта:

1) Убрать вкладки и создавать их в рантайме вместе с дочерними виджетами

2) Заполнить плейсхолдеры (серые поля) нужным содержимым.

baverman ★★★
()
Ответ на: комментарий от baverman

да ладно издеваться над ребенком.

Быстро же меня вычислили :)
baverman, ananas - спасибо. Теперь все работает.

netcat ★★
() автор топика
22 февраля 2012 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.