Gtk3在DrawingArea中加载PixbufAnimation?

时间:2015-01-06 12:20:49

标签: gtk gtk3 gdkpixbuf

为了我的gstreamer应用程序的目的,我在使用DrawingArea小部件的句柄来接收简单的加载器之前沉没元素。基本的想法是在Gtk.DrawingArea中加载一个动画的.gif但我运行的问题有文档。我发现了PixbufAnimation并将其与Gtk.Image小部件一起使用,但同样的逻辑对Gtk.DrawingArea并不起作用,因为它没有add from gi.repository import Gdk,Gtk,GdkPixbuf class animatedWin(Gtk.Window): def __init__(self): Gtk.Window.__init__(self,width_request=640,height_request=480) self.canvas=Gtk.Image() self.add(self.canvas) self.load_file() self.connect("delete-event",self.Gtk.main_quit) def load_file(self): self.loader=GdkPixbuf.PixbufAnimation.new_from_file("loader.gif") self.canvas.set_from_animation(self.loader) app=animatedWin() app.show_all() Gtk.main() 1}}方法我不知道该怎么做,作为我最后的手段,我来到这里寻求帮助。

这就是我用Gtk.Image所做的:

{{1}}

是否可以使用DrawingArea实现相同的功能?

1 个答案:

答案 0 :(得分:1)

gtk3 中的大多数小部件一样, DrawingArea 使用 cairo 来绘制它们。 Cairo 使用上下文吸引曲面。您可以通过

pixbuf 转换为 surface
public Surface Gdk.cairo_surface_create_from_pixbuf (Pixbuf pixbuf, int scale, Window? for_window)

返回

public Pixbuf? Gdk.pixbuf_get_from_surface (Surface surface, int src_x, int src_y, int width, int height)

(取自valadoc.org)

我的绘图应用程序中的示例代码段(我在编写Vala时学习Vala,因此可能不是最佳实现):

private void on_scale (Gtk.Button button) { // on button press
            var my_pixbuf = Gdk.pixbuf_get_from_surface (this.buf_surface, 0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
            var tmp_surface = Gdk.cairo_surface_create_from_pixbuf (my_pixbuf, 2, null);
            var ctx = this.ccc; //this.ccc is context of drawing surface
            ctx.set_source_surface (tmp_surface, 0, 0);
            ctx.paint();
            drawing_area.queue_draw(); // ask drawing_area to redraw, on redraw I have function/method that will paint drawing_area widget surface with drawing surface
        }

PS。有关cairo的更多信息,请参阅http://valadoc.org/#!api=cairo/Cairo。在我看来,cairo用于矢量图形,pixbuf用于栅格。