Pixmap
orでやりたいことができるとは思いませんがPixbuf
、既存の の上に落書きを実装するための 2 つの戦略を次に示しWidget
ます。最も明白な方法は、 draw イベントをキャッチしてWidget
'sDrawable
に直接描画し、途中に画像を保持しないようにすることです:
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()
再描画が要求されるたびに更新する必要のない中間 ARGB イメージが必要な場合の 2 番目のオプションは、イメージをImageSurface
. 上記の の代わりにexpose_handler
、画像を 1 回だけ描画します。
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()
これがあなたが探しているものである場合は、質問のタイトルを更新して、実際のニーズを反映することをお勧めします:)。