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()
绘图区小部件可以基于它发出的以下信号连接到回调函数−
Realize | 在特定显示器上实例化小部件时,采取任何必要的操作。 |
---|---|
configure_event | 当小部件改变大小时,采取任何必要的操作。 |
expose_event | 在绘图区域首次显示在屏幕上时,或者当它被另一个窗口覆盖然后显示(暴露)时,处理小部件内容的重绘。 |
鼠标和键盘事件也可以通过gtk.Widget
类的 add_events() 方法来调用回调函数。
特别有趣的是,在第一次出现绘图区域画布时,会触发expose-event
信号。在与expose-event
信号连接的回调函数中,调用了Cairo库中定义的绘制2D对象的不同方法。这些方法在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()
上述脚本将生成以下输出−