C更新GTK3的GUI元素

问题描述:

#include <gtk/gtk.h> 

GtkBuilder *builder; 
GtkWidget *window; 
GtkImage *image; 
GtkButton *but; 
char s[1000]; 

void on_button1_button_press_event(GtkWidget *but, gpointer data) 
{ 
    strcpy(s, "/home/linux/testing2.png"); 
    gtk_widget_queue_draw (image); 
} 

int main(void) 
{ 
    gtk_init(NULL, NULL); 
    builder = gtk_builder_new(); 
    gtk_builder_add_from_file(builder, "/home/linux/gui.xml", NULL); 
    window = (GtkWidget *) gtk_builder_get_object(builder, "window1"); 
    image = (GtkImage *) gtk_builder_get_object(builder, "image1"); 
    but = (GtkButton *) gtk_builder_get_object(builder, "button1"); 
    gtk_image_set_from_file(image, strcpy(s, "/home/linux/testing1.png")); 
    g_signal_connect(but, "clicked", G_CALLBACK(on_button1_button_press_event), NULL); 
    gtk_widget_show(window); 
    gtk_main(); 

    return 0; 
} 

当我点击“button1”,“callback”函数调用,它更新字符串s然后我想gtk刷新“image1”与gtk_widget_queue_draw。但“image1”没有改变。C更新GTK3的GUI元素

+1

请发布代码,没有代码无法帮助。具体显示文件路径更改后究竟调用了什么,以及您尝试执行的操作不起作用。原则上,您可以为此调用[gtk_widget_queue_draw()](https://developer.gnome.org/gtk3/stable/GtkWidget.html#gtk-widget-queue-draw),但在实践中,如果您设置了新图像这个函数应该被自动调用。 –

+0

谢谢你的回复。我发布了我的示例代码。 –

gtk_widget_queue_draw()需要一个字符串与图像的文件名。但它不会保留你传递的字符串。相反,小部件存储整个加载的图像。

所以你的s变量是没用的,改变它什么也不做。你应该做的,而不是在main()

gtk_image_set_from_file(image, "/home/linux/testing1.png"); 

,并在事件回调:

gtk_image_set_from_file(image, "/home/linux/testing2.png"); 

无需调用gtk_widget_queue_draw()因为改变图像自动做到这一点。

+0

谢谢你的解释。但是有可能使用我的变量? –

+0

@ cuncon-当然你可以,这是你的变量,但是对于什么?小部件不保留一个指向字符串的指针,并且你只使用文字字符串...那么你为什么要使用它? – rodrigo

+0

看来我做了一件多余的事情。啊,我想再问两个问题。 1.我想在事件发生时显示/隐藏整个窗口。我使用gtk_widget_show/hide()。这是对的吗? 2.是否可以监视gtk_main循环中的文件? –