PyGTK DrawingArea类
DrawingArea小组件展示了一个包含gtk.gdk.Window的空白画布,在上面可以绘制直线、矩形、圆弧等对象。
PyGTK使用Cairo库进行这样的绘制操作。Cairo是一个流行的2D矢量图形库。它是用C语言编写的,尽管它与大多数语言如C++、Java、Python、PHP等都有绑定关系。Cairo库可以用来在各种操作系统的标准输出设备上绘图。它还可以用来创建PDF、SVG和post-script文件。
为了执行不同的绘图操作,我们必须获取目标输出对象的设备上的文本。在这种情况下,由于绘图是出现在gtk.DrawingArea小部件上的,所以要获取它里面包含的gdk.Window的设备上下文。这个类有一个 cairo-create() 方法来返回设备上下文。
area = gtk.DrawingArea()
dc = area.window.cairo_create()
DrawingArea小组件可以根据它发出的以下信号连接到回调:
Realize | 当小组件被实例化在一个特定的显示器上时,要采取任何必要的行动。 |
---|---|
configure_event | 当小组件改变大小时采取任何必要的行动。 |
expose_event | 处理当绘图区第一次出现在屏幕上时,或者当它被另一个窗口覆盖后又被揭开(暴露)时,重新绘制小组件的内容。 |
鼠标和键盘事件也可以通过 gtk.Widget类 的 add_events()方法 来调用回调 。
特别有趣的是expose-event信号,它在DrawingArea画布第一次出现的时候被发出。在Cairo库中定义的绘制2D对象的不同方法,都是通过这个与expose-event信号相连的回调来调用的。这些方法在Cairo设备上下文中绘制相应的对象。
以下是可用的绘图方法
- dc.rectangle(x,y,w,h) – 在指定的左上角坐标处绘制一个矩形,并给出宽度和高度。
-
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) – 设置轮廓和填充的颜色,r、g和b值在0.0到1.0之间。
例子
下面的脚本使用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()
上述脚本将产生以下输出 –