1

私の gstreamer アプリケーションの目的で、シンク要素に DrawingArea ウィジェットのハンドルを与える前に、単純なローダーについて考えました.gif。ウィジェットPixbufAnimationで使用しましたが、同じロジックが機能せず、メソッドがないため、どうすればよいかわかりません。最後の手段として、ここに助けを求めに来ました。Gtk.ImageGtk.DrawingAreaadd

これは私が Gtk.Image で行ったことです:

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()

DrawingArea で同じことを達成することは可能ですか?

4

1 に答える 1

1

DrawingArea は、 gtk3のほとんどのウィジェットと同様に、描画にcairoを使用します。Cairoはcontextを使用して表面に描画します。次の方法でpixbuf表面に変換できます

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 を書きながら学習しているため、最適な実装ではない可能性があります):

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 はラスターに使用されます。

于 2015-10-09T15:30:07.050 に答える