pygtkで遊ぼう(14ー2) 四角くないWindow(2)
先日の「四角くないWindow」、ソースコードを少し直しました。
といっても、あまり変わっていないんですが。。
変更点
・前回作ったWindowクラスの初期化関数にPNG画像のファイル名を渡すと、
その形のウインドウになるようにしました。
・前回はsize-allocateシグナルを受けた時にウインドウにマスクを適応していましたが、
size-allocateシグナルって結構頻繁に発生するので、初期化関数内で1度だけ
処理するようにしました。
ソースコードはこんな感じです。
#-*- coding: utf-8 -*- import math import cairo import gtk from gtk import gdk class ShapedWindow(gtk.Window): def __init__(self, imageName): gtk.Window.__init__(self) self.set_position(gtk.WIN_POS_CENTER) self.set_decorated(False) self.connect('delete-event', self.on_delete_event) img = gtk.Image() img.set_from_file(imageName) self.add(img) self.set_resizable(False) buff = img.get_pixbuf() self.bitmap = gtk.gdk.Pixmap(None, buff.get_width(), buff.get_height(), 1) ca = self.bitmap.cairo_create() ca.set_source_rgb(0, 0, 0) ca.set_operator(cairo.OPERATOR_DEST_OUT) ca.paint() img = cairo.ImageSurface.create_from_png(imageName) ca.set_source_surface(img) ca.set_operator(cairo.OPERATOR_OVER) ca.paint() self.shape_combine_mask(self.bitmap, 0, 0) def on_delete_event(self, widget, event=None): print '-- quit --' gtk.main_quit() # # if __name__ == '__main__': win = ShapedWindow('blender_logo.png') win.show_all() gtk.main()
上記を実行すると、以前作成したBlenderロゴの形のウインドウが
表示されます。
いや〜、面白いですね。