(gtk:4783): Gtk-CRITICAL **: gtk_image_set_from_pixbuf: 断言 'GTK_IS_IMAGE (image)' 失败
(gtk:4783): Gtk-CRITICAL **: gtk_image_set_from_pixbuf: assertion 'GTK_IS_IMAGE (image)' failed
这是我的代码:
#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。没有 if/else 像你那样重复代码。然后在一个GdkPixbuf
中载入你要显示的图片,这是真正存储像素数据的objet。这是使用 gdk_pixbuf_new_from_file
完成的,可以帮助您保留图像数据以防您想要再次显示它(缓存)。然后使用 gtk_image_set_from_pixbuf
要求 GtkImage 更改它显示的图像。
关于您的交互式循环:您不能这样做,除非您每次 create/destroy 整个 UI 每次被问到一个新号码时,这不是刷新。您需要做的是:
- 询问用户要显示的所有帧的编号,然后
然后,创建 window 和内容以及 运行 gtk 主循环。
- 或更好,使用
g_timeout_add
的超时事件源,这将创建定期调用回调,您可以在其中增加帧计数器。使用此计数器获取适当的图像,并调用 gtk_image_set_from_pixbuf
或 gtk_image_set_from_file
.
这是我的代码:
#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。没有 if/else 像你那样重复代码。然后在一个GdkPixbuf
中载入你要显示的图片,这是真正存储像素数据的objet。这是使用 gdk_pixbuf_new_from_file
完成的,可以帮助您保留图像数据以防您想要再次显示它(缓存)。然后使用 gtk_image_set_from_pixbuf
要求 GtkImage 更改它显示的图像。
关于您的交互式循环:您不能这样做,除非您每次 create/destroy 整个 UI 每次被问到一个新号码时,这不是刷新。您需要做的是:
- 询问用户要显示的所有帧的编号,然后 然后,创建 window 和内容以及 运行 gtk 主循环。
- 或更好,使用
g_timeout_add
的超时事件源,这将创建定期调用回调,您可以在其中增加帧计数器。使用此计数器获取适当的图像,并调用gtk_image_set_from_pixbuf
或gtk_image_set_from_file
.