Python with GTK+3.0 Create GtkPixbuf

Python with GTK+3.0 で GtkPixbuf をファイルから作成する方法。

GDK 3 Reference Manual

こっちでは見つからなくて困っていた、GDK じゃなくなったのかな?
でも色々探していたら同じ GNOME 内でこんなのを見つけた。

API Reference
File Loading

なんだ、こっちに定義されていたのか。
Python ではどう書くか解らないからとにかく dir() を使って自力で調べる。

見つからない、もっと下の階層なのかな。
#include <gdk-pixbuf/gdk-pixbuf.h>
なんだからもしかして

やっと見つかった、コツがなんとなく解ってきた。
つまり gi.repository はヘッダの階層位置どおりに指定する必要があるのね。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from gi.repository import Gtk, GdkPixbuf

class PixbufTest(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        # pixbuf
        self.pixbuf = GdkPixbuf.Pixbuf.new_from_file("god_madoka.png")
        self.set_icon(self.pixbuf)
        self.connect("delete-event", Gtk.main_quit)
        self.show_all()

if __name__ == '__main__':
    w = PixbufTest()
    Gtk.main()

コレでとりあえずファイルからアイコンを作る方法は解ったぞと。

次は GtkDrawingArea を使ってサーフェスに描写…
expose-event シグナル名が draw に変わっているなぁ…
cairo_t がなんだかよく解らない、まだまだ調べなきゃ。

追記

Migrating from GTK+ 2.x to GTK+ 3

上記を見ると、とにかく GTK+ 3.0 の描写は cairo_t を使えになっているな。
pixbuf でページ内検索して見つかった cairo_set_source_pixbuf を利用かな。

draw callback 引数の cairo_t から得られるメソッドにそんなもの無い…
Gdk 以下で見つかった、static メソッドは分離しているようだ。

set して cr.paint() だけで画像は表示できるようだ。
GtkDrawingArea
上記の fill() は何だろう、まあ実際にやってみるのが一番早い。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from gi.repository import Gtk, GdkPixbuf, Gdk, GLib

class PixbufTest(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.da = Gtk.DrawingArea()
        self.da.connect("draw", self.on_draw)
        self.add(self.da)
        # pixbuf
        self.pixbuf = GdkPixbuf.Pixbuf.new_from_file("god_madoka.png")
        #self.set_icon(self.pixbuf)
        self.connect("delete-event", Gtk.main_quit)
        self.show_all()

    def on_draw(self, widget, cr):
        """
            # Gtk+ 2.* (PyGtk) draw picture
            gc = widget.style.fg_gc[Gtk.StateType.NORMAL]
            widget.window.draw_pixbuf(gc, self.pixbuf, 0, 0, 0, 0, -1, -1)
        """
        # set picture
        Gdk.cairo_set_source_pixbuf(cr, self.pixbuf, 0, 0)
        #cr.paint()
        # draw arc
        width = widget.get_allocated_width()
        height = widget.get_allocated_height()
        cr.arc( width / 2.0,
                height / 2.0,
                min(width, height) / 2.0,
                0,
                2 * GLib.PI)
        cr.fill()

if __name__ == '__main__':
    w = PixbufTest()
    Gtk.main()

そういうことみたい、リージョン指定なんだね。
てゆーかたったこれだけなのに import 多いな。