C 更新 GTK3 的 GUI 元素

标签 c gtk

#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 使用 gtk_widget_queue_draw 刷新“image1”。但“image1”没有改变。

最佳答案

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(),因为更改图像会自动执行此操作。

关于C 更新 GTK3 的 GUI 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45923896/

相关文章:

c - 在二维数组中的随机位置弹出一个数字

c - 调试断言失败 C - 不删除

c - 如何修改指向void函数内部结构的指针

ubuntu - Gtk警告** : cannot open display launching background GTK

c - 在windows下安装gtk并使用gcc编译?

c - 为二维数组 c 分配内存

C: for 循环中的 Scanf 函数比它应该多运行一次

c - 使用 GTK 回调函数提交数组

windows - Windows 和 OS X 上的 GTK+ 是使用 native 小部件还是模拟它们?

python - 开罗:在 x 和 y 中绘制从 0 到 1 的空间中的所有内容,并且仅在最后重新缩放到特定分辨率(可调整大小的窗口)