(gtk:4783):Gtk-CRITICAL **:gtk_image_set_from_pixbuf:断言'GTK_IS_IMAGE(image)'失败

时间:2017-12-12 10:17:26

标签: 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个图像,还有一个循环,我想为奇数显示一个图像,为偶数显示其他图像。 但这个简单的任务似乎很难做到!请帮我纠正我的代码......谢谢!

1 个答案:

答案 0 :(得分:3)

修改

最终回答&#34;如何在不与事件循环交互的情况下显示图像并从程序中更改图像&#34;在这里:https://stackoverflow.com/a/47791066/518853

OLD ANSWER(由于问题中的多次修改,现在有点无用):

您不需要创建新的GtkImage来改变图像。 Juste创建了一个内部带有GtkImage的简单GtkWindow。不,如果/你喜欢你正在做那些重复的代码。然后将要显示的图像加载到GdkPixbuf中,这是真正存储像素数据的对象。这是使用gdk_pixbuf_new_from_file完成的,可以帮助您保留图像数据,以防再次显示(缓存)。然后使用gtk_image_set_from_pixbuf要求GtkImage更改它显示的图像。

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

  • 询问用户要显示的所有帧的编号,以及 然后,创建窗口和东西并运行gtk主循环。
  • 或更好,使用g_timeout_add使用超时事件源,它会定期调用回调,您可以在其中增加帧计数器。使用此计数器获取相应的图片,然后致电gtk_image_set_from_pixbufgtk_image_set_from_file