Gtk图像不显示在C中

Gtk图像不显示在C中,c,gtk,C,Gtk,您好,我有一些关于GTK的问题,我使用“文件选择器”对话框来选择一个图像,并在单击“确定”后打开它,但这不起作用,并且没有显示任何内容。有人能给我解释一下吗? 这里是代码,谢谢你的回答 #include <stdlib.h> #include <gtk/gtk.h> static void open_file(GtkWidget* pOpen, gpointer pWindow, GtkWidget* pTable,) { GtkWidget *im

您好,我有一些关于GTK的问题,我使用“文件选择器”对话框来选择一个图像,并在单击“确定”后打开它,但这不起作用,并且没有显示任何内容。有人能给我解释一下吗? 这里是代码,谢谢你的回答

#include <stdlib.h>
#include <gtk/gtk.h>



static void open_file(GtkWidget* pOpen, gpointer pWindow, GtkWidget* pTable,)
{        
GtkWidget *image = NULL;
GtkWidget *open;
open = gtk_file_chooser_dialog_new("Select a file", GTK_WINDOW(pWindow),
GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_OK, GTK_RESPONSE_OK, 
    GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL);
    gtk_widget_show_all(open);
    gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(open),
    g_get_home_dir());
gint resp = gtk_dialog_run(GTK_DIALOG(open));
if(resp == GTK_RESPONSE_OK)
    {
            GtkFileChooser *chooser = GTK_FILE_CHOOSER(open);
            image = gtk_image_new_from_file(gtk_file_chooser_get_filename(chooser));
            gtk_table_attach_defaults(GTK_TABLE(pTable),image,
            8,12,10,20);
    }
else
    g_print("You pressed Cancel\n");
gtk_widget_destroy(open);
} 

int main(int argc,char *argv[])
{
//Variable
GtkWidget *pWindow = NULL;
GtkWidget *pLabel = NULL;
GtkWidget *pTable = NULL;
GtkWidget *pButton = NULL;
GtkWidget *pOpen = NULL;  



//Iniatialisation && attributs
gtk_init(&argc, &argv);
pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(pWindow), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(pWindow), 720, 480);
pTable = gtk_table_new(40,20, TRUE);
pButton = gtk_button_new_with_label("Open Image");




//Position of the box
gtk_table_attach_defaults(GTK_TABLE(pTable), pButton,
3,7,5,7);
gtk_table_attach_defaults(GTK_TABLE(pTable), pLabel,
3,7,8,9);
gtk_table_attach_defaults(GTK_TABLE(pTable), image,
3,7,1,3);

//add the table to the main window
gtk_container_add(GTK_CONTAINER(pWindow), GTK_WIDGET(pTable));

//Signal
g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(G_OBJECT(pButton), "clicked", G_CALLBACK(open_file), NULL);
gtk_widget_show_all(pWindow);
gtk_main();

}

您阅读的是未初始化的全局文件!在启动主循环之前使用变量路径,然后再也不要这样做。path变量首先作为gtk_主线内的回调进行填充,该主线处理UI、信号和一系列其他内容。

mainloop?你是说主要功能?我对使用GTK非常陌生,我可能不理解你的意思GTK_main是一个main循环,它处理所有的GSignal和回调。问问自己,pButton clicked回调是否执行。因此,当用户单击ok并使用来自主函数的回调时,我必须输入一个gsignal?您已经做得很好了,您将回调挂接到button提供的单击信号,这完全没问题。关键是,您从不从磁盘加载任何内容。您需要销毁并重新创建图像,或者从文件中读取图像数据。仅仅更新路径是不够的,GtImage不观察变量的变化。阅读API文档。它们实际上很有用。我更改了回调函数并加载了一个带有我在原始帖子中修改代码路径的图像,但我不知道为什么这仍然不起作用