这是我的代码:

#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即可更改图像。 Juste创建一个带有GtkImage的简单GtkWindow。否,如果像您正在做的那样重复代码。然后将要显示的图像加载到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严重**:gtk_image_set_from_pixbuf:断言 'GTK_IS_IMAGE (image)'失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47770110/

    10-11 06:45