C 对话框不会再次打开。GTK+;,林间空地

C 对话框不会再次打开。GTK+;,林间空地,c,windows,gtk,glade,C,Windows,Gtk,Glade,我正在使用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: a

我正在使用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);
}


正如mfro上面所说,您需要调用
gtk_widget_hide()
而不是
gtk_widget_destroy()
,您还需要将
delete事件
信号连接到
gtk_widget_hide_on_delete()
以在单击右上角的关闭按钮时停止销毁窗口


Glade XML已被弃用,它已被Gtk本身包含的替换。使用search和replace将glade_xml函数调用更改为相应的GtkBuilder函数调用应该非常容易。如果您在glade中创建了xml接口描述,它们将与GtkBuilder一起使用,不会有任何问题。

您确定正确设置了显示吗?然而,正如我所记得的,在Ubuntu中遇到了一个像gtk bug一样的严重错误。如果你想重用这些小部件(否则它们会被释放),用
gtk_widget_hide()
替换
gtk_widget_destroy()。@Edenia:设置显示部分我不明白。我正在使用windows。@mfro:当我在对话框中使用默认的关闭按钮(右上角)而不是取消按钮时,问题也存在。正如mfro上面所说,您需要调用
gtk\u widget\u hide()
而不是
gtk\u widget\u destroy()
当您单击右上角的关闭按钮时,您还需要将
销毁
信号连接到
gtk_widget_hide_on_delete()
以停止销毁窗口。Glade XML已被弃用,它已被Gtk本身包含的替换。
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);
}