Python with GTK+3.0 で GtkPixbuf をファイルから作成する方法。
こっちでは見つからなくて困っていた、GDK じゃなくなったのかな?
でも色々探していたら同じ GNOME 内でこんなのを見つけた。
なんだ、こっちに定義されていたのか。
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 多いな。