我不认为你可以用Pixmap
or做你想做的事Pixbuf
,但这里有两种策略可以在现有的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 图像,则将图像预渲染为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()
如果这是您正在寻找的东西,我建议您更新问题的标题以反映您的真正需求:)。