我不認爲你可以做你想做一個Pixmap
或Pixbuf
什麼,但這裏是實現塗鴉在現有Widget
的前兩名策略。其中最明顯的就是趕上抽獎活動,直畫到Widget
的Drawable
,在中間沒有任何保留的圖像:
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形象,每次請求重繪時不必更新,而是將圖像預先渲染到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()
如果這是你要找的那種事情,我會建議更新問題的標題,以反映您的實際需要: )。
另請參閱http://stackoverflow.com/questions/3048148/alpha-blending-in-gtk – sdaau 2013-12-10 13:53:38