c++ - (GTK :4783): Gtk-CRITICAL **: gtk_image_set_from_pixbuf: assertion 'GTK_IS_IMAGE (image)' failed

标签 c++ image gtk refresh destroy

这是我的代码:

#include <gtk/gtk.h>
#include <gdk-pixbuf/gdk-pixbuf.h>

void destroy(void) {
    gtk_main_quit();
}


int main()
{
    GdkPixbuf* buf;
    GdkPixbuf* buf2;
    GError* err = NULL;
    int a=0, i=0, j=0;

    GtkWidget* window;
    GtkWidget *image =0;

    gtk_init (NULL,NULL);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    buf = gdk_pixbuf_new_from_file("1.jpg", &err);
    buf2 = gdk_pixbuf_new_from_file("2.jpg", &err);

    for(i=0; i<10; i++)
    {
        if((i%2)==0)
        {
            gtk_image_set_from_pixbuf(GTK_IMAGE(image), buf);

            for(j=0; j<10000; j++)
            {}
        }
        else
        {
            gtk_image_set_from_pixbuf(GTK_IMAGE(image), buf2);
            for(j=0; j<10000; j++)
            {}
        }

        g_signal_connect(G_OBJECT (window), "destroy",
        G_CALLBACK (destroy), NULL);
        gtk_container_add(GTK_CONTAINER (window), image);
        gtk_widget_show_all(window);
        gtk_main();
    }

    return 0;
}

这是结果:

(gtk:4783): Gtk-CRITICAL **: gtk_image_set_from_pixbuf: assertion 'GTK_IS_IMAGE (image)' failed

(gtk:4783): Gtk-CRITICAL **: gtk_container_add: assertion 'GTK_IS_WIDGET (widget)' failed
^C

我想做的是:我有 2 张图片,还有一个循环,我想为奇数显示一张图片,为偶数显示另一张图片。 但是这个简单的任务似乎很难做到!请帮助我更正我的代码...谢谢!

最佳答案

您不需要为了更改图像而创建新的 GtkImage。只需创建一个简单的 GtkWindow,里面有一个 GtkImage。不,如果/否则就像你那样做重复代码。然后在GdkPixbuf中加载你想要显示的图像,这是真正存储像素数据的对象。这是使用 gdk_pixbuf_new_from_file 完成的,它可以帮助您保存图像数据以备再次显示时使用(缓存)。然后使用 gtk_image_set_from_pixbuf 要求 GtkImage 更改它显示的图像。

关于您的交互式循环:您不能这样做,除非您在每次询问新号码时创建/销毁整个 UI,这不是刷新。您需要做的是:

  • 询问用户你想要显示的所有帧的编号,然后 然后,创建窗口和内容并运行 gtk 主循环。
  • 或者更好的是,使用 g_timeout_add 的超时事件源会定期调用回调,您可以在其中增加帧计数器。使用此计数器获取适当的图像,并调用 gtk_image_set_from_pixbufgtk_image_set_from_file

关于c++ - (GTK :4783): Gtk-CRITICAL **: gtk_image_set_from_pixbuf: assertion 'GTK_IS_IMAGE (image)' failed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47770110/

相关文章:

c++ - 如何将 c/c++ 应用程序移植到旧版 linux 内核版本

c++ - 错误到底是什么以及错误地为可 move 和不可复制成员调用复制构造函数有什么解决方法

ios - Monotouch 的照片/图像查看器

css - 在 C 代码中更改 GtkToggleToolButton 的文本颜色 (GTK+3)

c - 获取当前关键焦点 clutter_actor 之前具有关键焦点的 clutter_actor

c - Gtk-CRITICAL ** : 16:04:21. 737:gtk_box_pack:断言 'GTK_IS_WIDGET (child)' 失败

c++ - vector 中的前半部分指针在循环结束后被重新分配

c++ - 类型特征以匹配不同类的成员函数的签名

c# - 在另一个大图像中快速找到一个较小的图像

html - 为什么流体背景 SVG 文件不能在所有尺寸下正确显示?