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 多いな。


