Диалоговые окна не открываются второй раз. GTK+, Glade и C

Я разрабатываю интерфейс, используя GTK+ и Glade. Я создал несколько диалоговых окон с помощью Glade и подключился через код C. Они отлично работают в первый раз, но когда пользователь пытается использовать их повторно, программа перестает работать. Командное окно дает

(program_name.exe:1668): GLib-GObject-Warning **: invalid (NULL) pointer instance
(program_name.exe:1688): GLib-Gobject-Critical **: g_signal_connect_data: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed
(program)name.exe:1668): Gtk-CRITICAL **: gtk_widget_show: assertion 'GTK_IS_WIDGET(widget)' failed

Вот код

GtkWidget *entry_obs_cells[12];
void
on_observation_cells_activate(GtkWidget *widget, gpointer user_data){
GtkWidget *observation_cells;
observation_cells = glade_xml_get_widget (gxml, "dialog3_obs_cells");
GtkWidget *label1, *label2, *label3, *label4, *label5, *label6, *label7, *label8, *label9, *label10, *time_interval;
label1 = glade_xml_get_widget(gxml, "label1");
label2 = glade_xml_get_widget(gxml, "label2_obs_cells");
label3 = glade_xml_get_widget(gxml, "label3_obs_cells");
label4 = glade_xml_get_widget(gxml, "label4_obs_cells");
label5 = glade_xml_get_widget(gxml, "label5_obs_cells");
label6 = glade_xml_get_widget(gxml, "label6_obs_cells");
label7 = glade_xml_get_widget(gxml, "label7_obs_cells");
label8 = glade_xml_get_widget(gxml, "label8_obs_cells");
label9 = glade_xml_get_widget(gxml, "label9_obs_cells");
label10 = glade_xml_get_widget(gxml, "label10_obs_cells");


GtkWidget *button1,*button2;
button1 = glade_xml_get_widget(gxml,"Save_obs_cells");
button2 = glade_xml_get_widget(gxml,"Cancel_obs_cells");

entry_obs_cells[1] = glade_xml_get_widget(gxml, "entry1_obs_cells");
entry_obs_cells[2] = glade_xml_get_widget(gxml, "entry2_obs_cells");
entry_obs_cells[3] = glade_xml_get_widget(gxml, "entry3_obs_cells");
entry_obs_cells[4] = glade_xml_get_widget(gxml, "entry4_obs_cells");
entry_obs_cells[5] = glade_xml_get_widget(gxml, "entry5_obs_cells");
entry_obs_cells[6] = glade_xml_get_widget(gxml, "entry6_obs_cells");
entry_obs_cells[7] = glade_xml_get_widget(gxml, "entry7_obs_cells");
entry_obs_cells[8] = glade_xml_get_widget(gxml, "entry8_obs_cells");
entry_obs_cells[9] = glade_xml_get_widget(gxml, "entry9_obs_cells");
entry_obs_cells[10] = glade_xml_get_widget(gxml, "entry10_obs_cells");
entry_obs_cells[11] = glade_xml_get_widget(gxml, "entry_obs_cells");
entry_obs_cells[12] = glade_xml_get_widget(gxml, "entry12_obs_cells");

gtk_widget_show (observation_cells);
g_signal_connect(GTK_BUTTON(button1), "clicked", G_CALLBACK(on_Save_obs_cells_activate), observation_cells);
g_signal_connect(GTK_BUTTON(button2), "clicked", G_CALLBACK(on_Cancel_obs_cells_activate), NULL);

}

on_Save_obs_cells_activate()
{
    char *record_results=(char*)malloc(500);
    strcpy(record_results,project_dir);
    strcat(record_results,"\\Record_results.txt");
    printf("\n%s\n",record_results);
    FILE *file;
    file = fopen(record_results, "w+");
    fprintf(file, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", gtk_entry_get_text(GTK_ENTRY(entry_obs_cells[11])),gtk_entry_get_text(GTK_ENTRY(entry_obs_cells[11])),gtk_entry_get_text(GTK_ENTRY(entry_obs_cells[1])),gtk_entry_get_text(GTK_ENTRY(entry_obs_cells[2])),gtk_entry_get_text(GTK_ENTRY(entry_obs_cells[3])),gtk_entry_get_text(GTK_ENTRY(entry_obs_cells[4])),gtk_entry_get_text(GTK_ENTRY(entry_obs_cells[5])),gtk_entry_get_text(GTK_ENTRY(entry_obs_cells[6])),gtk_entry_get_text(GTK_ENTRY(entry_obs_cells[7])),gtk_entry_get_text(GTK_ENTRY(entry_obs_cells[8])),gtk_entry_get_text(GTK_ENTRY(entry_obs_cells[9])),gtk_entry_get_text(GTK_ENTRY(entry_obs_cells[10])));
    fclose(file);

}

void
on_Cancel_obs_cells_activate (GtkButton *button, gpointer dialog)
{
    gtk_widget_destroy(dialog);
}

person Aveeral Jain    schedule 30.06.2014    source источник
comment
Вы уверены, что правильно настроили дисплей? Однако, насколько я помню, возникла критическая ошибка, похожая на ошибку gtk в Ubuntu.   -  person Edenia    schedule 30.06.2014
comment
замените gtk_widget_destroy() на gtk_widget_hide(), если вы хотите повторно использовать виджеты (в противном случае они будут освобождены).   -  person mfro    schedule 30.06.2014
comment
@Edenia: часть настройки отображения я не понял. Я работаю с помощью окон.   -  person Aveeral Jain    schedule 30.06.2014
comment
@mfro: проблемы также возникают, когда я использую кнопку закрытия по умолчанию (в верхнем правом углу) вместо кнопки «Отмена» в диалоговом окне.   -  person Aveeral Jain    schedule 30.06.2014
comment
Как mfro сказал выше, вам нужно вызвать gtk_widget_hide() вместо gtk_widget_destroy(), также вам нужно будет подключить сигнал destroy к gtk_widget_hide_on_delete(), чтобы остановить разрушение окна, когда вы нажимаете кнопку закрытия в верхнем правом углу. Glade XML устарел, он был заменен GtkBuilder, который входит в состав Gtk. сам.   -  person Phillip Wood    schedule 30.06.2014
comment
Извините, что нужно было подключить delete-event к gtk_widget_hide_on_delete(), а не к destroy   -  person Phillip Wood    schedule 30.06.2014
comment
@PhillipWood Действительно поздно менять все на GtkBuilder. Другое предложение кажется мне уместным. Попробую обновить.   -  person Aveeral Jain    schedule 01.07.2014
comment
GtkBuilder был добавлен 7 лет назад, а libglade устарела более пяти лет назад - так что да, это действительно довольно поздно :) @PhillipWood, пожалуйста, напишите этот комментарий в качестве ответа, чтобы этот вопрос не казался без ответа.   -  person Jussi Kukkonen    schedule 01.07.2014


Ответы (1)


Как mfro сказал выше, вам нужно вызвать gtk_widget_hide() вместо gtk_widget_destroy(), также вам нужно будет подключить сигнал delete-event к gtk_widget_hide_on_delete(), чтобы остановить разрушение окна, когда вы нажимаете кнопку закрытия в верхнем правом углу.

Glade XML устарел, он был заменен GtkBuilder, который включен в сам Gtk. . Должно быть достаточно просто использовать поиск и замену, чтобы заменить вызовы функций Glade_xml на соответствующие вызовы GtkBuilder. Если вы создали XML-описания интерфейса в Glade, они без проблем будут работать с GtkBuilder.

person Phillip Wood    schedule 01.07.2014