DrawingArea 类(DrawingArea Class)
DrawingArea小部件显示一个空白画布,其中包含gtk.gdk.Window,可在其上绘制线,矩形,弧等对象。
PyGTK使用Cairo库进行此类绘图操作。 开罗是一个流行的2D矢量图形库。 它是用C语言编写的,但它在大多数语言中都有绑定,如C ++,Java,Python,PHP等。开罗库可用于在各种操作系统中绘制标准输出设备。 它还可用于创建PDF,SVG和后脚本文件。
为了执行不同的绘图操作,我们必须在目标输出对象的文本上获取设备。 在这种情况下,由于图形出现在gtk.DrawingArea小部件上,因此获得了包含在其中的gdk.Window的设备上下文。 该类有一个cairo-create()方法,它返回设备上下文。
area = gtk.DrawingArea()
dc = area.window.cairo_create()
DrawingArea小部件可以根据它发出的以下信号连接到回调 -
Realize | 在特定显示器上实例化窗口小部件时执行任何必要的操作。 |
configure_event | 在窗口小部件更改大小时执行任何必要的操作。 |
expose_event | 当绘图区域首次出现在屏幕上时,或者当它被另一个窗口覆盖然后被揭开(暴露)时,处理重新绘制窗口小部件的内容。 |
鼠标和键盘事件也可用于通过gtk.Widget class add_events() method调用回调。
特别感兴趣的是在DrawingArea画布首次出现时发出的曝光事件信号。 从连接到expose-event信号的回调中调用在Cairo库中定义的用于绘制2D对象的不同方法。 这些方法在Cairo设备上下文中绘制相应的对象。
以下是可用的绘图方法 -
dc.rectangle(x,y,w,h) - 在指定的左上角坐标处绘制一个矩形,并具有givwn宽度和高度。
dc.arc(x,y,r,a1,a2) - 绘制一个给定半径和两个角度的圆弧。
dc.line(x1,y1,x2,y2) - 在两对坐标之间绘制一条直线。
dc.line_to(x,y) - 从当前位置到(x,y)绘制一条线
dc.show_text(str) - 在当前光标位置绘制字符串
dc.stroke() - 绘制轮廓
dc.fill() - 用当前颜色填充形状
dc.set_color_rgb(r,g,b) - 将颜色设置为轮廓并填充介于0.0到1.0之间的r,g和b值
例子 (Example)
以下脚本绘制不同的形状并使用Cairo方法进行测试。
import gtk
import math
class PyApp(gtk.Window):
def __init__(self):
super(PyApp, self).__init__()
self.set_title("Basic shapes using Cairo")
self.set_size_request(400, 250)
self.set_position(gtk.WIN_POS_CENTER)
self.connect("destroy", gtk.main_quit)
darea = gtk.DrawingArea()
darea.connect("expose-event", self.expose)
self.add(darea)
self.show_all()
def expose(self, widget, event):
cr = widget.window.cairo_create()
cr.set_line_width(2)
cr.set_source_rgb(0,0,1)
cr.rectangle(10,10,100,100)
cr.stroke()
cr.set_source_rgb(1,0,0)
cr.rectangle(10,125,100,100)
cr.stroke()
cr.set_source_rgb(0,1,0)
cr.rectangle(125,10,100,100)
cr.fill()
cr.set_source_rgb(0.5,0.6,0.7)
cr.rectangle(125,125,100,100)
cr.fill()
cr.arc(300, 50, 50,0, 2*math.pi)
cr.set_source_rgb(0.2,0.2,0.2)
cr.fill()
cr.arc(300, 200, 50, math.pi,0)
cr.set_source_rgb(0.1,0.1,0.1)
cr.stroke()
cr.move_to(50,240)
cr.show_text("Hello PyGTK")
cr.move_to(150,240)
cr.line_to(400,240)
cr.stroke()
PyApp()
gtk.main()
上面的脚本将生成以下输出 -