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元素
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()
因为改变图像自动做到这一点。
谢谢你的解释。但是有可能使用我的变量? –
@ cuncon-当然你可以,这是你的变量,但是对于什么?小部件不保留一个指向字符串的指针,并且你只使用文字字符串...那么你为什么要使用它? – rodrigo
看来我做了一件多余的事情。啊,我想再问两个问题。 1.我想在事件发生时显示/隐藏整个窗口。我使用gtk_widget_show/hide()。这是对的吗? 2.是否可以监视gtk_main循环中的文件? –
请发布代码,没有代码无法帮助。具体显示文件路径更改后究竟调用了什么,以及您尝试执行的操作不起作用。原则上,您可以为此调用[gtk_widget_queue_draw()](https://developer.gnome.org/gtk3/stable/GtkWidget.html#gtk-widget-queue-draw),但在实践中,如果您设置了新图像这个函数应该被自动调用。 –
谢谢你的回复。我发布了我的示例代码。 –