为了说明我在评论中提出的观点,让我发布一个快速'n'dirty PyGtk的例子,它使用
GtkDrawingArea
来创建一个画布,并使用cairo在其中作画。
CORRECTION
你说的是PyGObject,也就是Gtk+3,所以例子如下(主要区别是没有
expose
事件,而是
draw
,并且已经把一个开罗上下文作为参数传递了)。
#!/usr/bin/python
from gi.repository import Gtk
import cairo
import math
def OnDraw(w, cr):
cr.set_source_rgb(1, 1, 0)
cr.arc(320,240,100, 0, 2*math.pi)
cr.fill_preserve()
cr.set_source_rgb(0, 0, 0)
cr.stroke()
cr.arc(280,210,20, 0, 2*math.pi)
cr.arc(360,210,20, 0, 2*math.pi)
cr.fill()
cr.set_line_width(10)
cr.set_line_cap(cairo.LINE_CAP_ROUND)
cr.arc(320, 240, 60, math.pi/4, math.pi*3/4)
cr.stroke()
w = Gtk.Window()
w.set_default_size(640, 480)
a = Gtk.DrawingArea()
w.add(a)
w.connect('destroy', Gtk.main_quit)
a.connect('draw', OnDraw)