2009-06-09 6 views
1

透明に設定された1つのピクセル値でPyGTKピックスマップを作成するにはどうすればよいですか?私はそれが何か深さ1のpixmapを作成し、それをマスクとして設定するのと関係があると知っていますが、私が見つけたのは、描画したときに何もしないか、完全に私のpixmapを消去するということです。現在のところ、私はpixmapをPyGTKのピックスマップ透明度

r = self.get_allocation() 
p1 = gtk.gdk.Pixmap(self.window,r.width,r.height) 
p1_c = p1.cairo_create() 

とし、カイロを使って黒線を引いています。私ができるようにしたいのは、線で覆われていない領域をすべて透明にすることです(白を透明な色にします)。draw_drawableを使ってウィンドウに描画すると、すべてが '下にあります'そのまま。

この問題に関するよくある質問とメーリングリストの投稿は、時代遅れであるため、ほとんど役に立たない。誰かがここに知っている必要があります!

+0

も参照してください。http://stackoverflow.com/questions/3048148/alpha-blending-in-gtk – sdaau

答えて

1

PixmapではなくPixbufを使用したいと思うようです。 Pixbufには透明度を与えるアルファ設定が含まれていますが、Pixmapは透明ではありません。

+1

ありがとうございました。私はPyGTK Pixbufのドキュメントを見てきましたが、カイロの表面を描くための表面として使う方法はないようです。 PixbufとImageSurfaceを使い分けるためにPixbufとImageSurfaceの間で前後に変換する必要がありますか? –

2

PixmapまたはPixbufであなたが望むことはできませんが、ここには既存のWidgetの上に落書きを実装する2つの方法があります。あなたはその中間のARGBイメージを持つようにしたい場合は、

from gtk import Window, Button, main 
from math import pi 
import cairo 

w = Window() 
b = Button("Draw on\ntop of me!") 

def scribble_on(cr): 
    cr.set_source_rgb(0, 0, 0) 
    cr.rectangle(10, 10, 30, 30) 
    cr.fill() 
    cr.arc(50, 50, 10, 0, pi) 
    cr.stroke() 

def expose_handler(widget, event): 
    cr = widget.window.cairo_create() 
    cr.rectangle(event.area.x, event.area.y, 
       event.area.width, event.area.height) 
    cr.clip() 
    scribble_on(cr) 
    return False 

b.connect_after("expose_event", expose_handler) 
w.add(b) 
w.set_size_request(100, 100) 
w.show_all() 
main() 

番目のオプション:最も明白な1はちょうどドローイベントをキャッチするとWidgetDrawableにストレートドロー、途中でノー保持された画像であります再描画が要求されるたびに更新する必要はありません。画像をImageSurfaceに事前レンダリングする必要があります。ここでは一度だけ画像を描画することを、上記、expose_handlerの置き換えです:

import cairo 
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 100, 100) 
scribble_on(cairo.Context(surface)) 

def expose_image_handler(widget, event): 
    cr = widget.window.cairo_create() 
    cr.rectangle(event.area.x, event.area.y, 
       event.area.width, event.area.height) 
    cr.clip() 
    cr.set_source_surface(surface) 
    cr.paint() 

これはあなたが探しているものの一種であるならば、私はあなたの本当のニーズを反映させるために、質問のタイトルを更新する推薦します: )。