Pygtk 简明教程

PyGTK - DrawingArea Class

DrawingArea 小部件显示一个空白画布,画布上包含一个 gtk.gdk.Window,可以在其上绘制线条、矩形、弧线等对象。

PyGTK 使用 Cairo 库进行此类绘图操作。Cairo 是一个流行的二次矢量图形库。它用 C 语言编写,但在大多数语言中都有绑定,如 C++、Java、Python、PHP 等。Cairo 库可用于在各种操作系统中绘制标准输出设备。它还可以用于创建 PDF、SVG 和 PostScript 文件。

为了执行不同的绘图操作,我们必须提取目标输出对象的文本设备。在本例中,由于绘图出现在 gtk.DrawingArea 小部件上,因此会获取其内部包含的 gdk.Window 的设备上下文。此类具有一个 cairo-create() 方法,该方法返回设备上下文。

area = gtk.DrawingArea()
dc = area.window.cairo_create()

DrawingArea 小部件可以基于它发出的以下信号连接到回调:

Realize

当小部件在特定显示器上实例化时执行任何必要操作。

configure_event

当小部件大小改变时执行任何必要操作。

expose_event

当绘图区域第一次出现在屏幕上或当它被另一个窗口覆盖然后取消覆盖(公开)时,处理重新绘制小部件的内容。

鼠标和键盘事件也可以通过 gtk.Widget classadd_events() method 调用回调。

特别感兴趣的是当 DrawingArea 画布第一次出现时发出的 expose-event 信号。定义在 Cairo 库中的用于绘制 2D 对象的不同方法从此回调中调用,该回调连接到 expose-event 信号。这些方法在 Cairo 设备上下文中绘制相应的对象。

以下是可以使用的绘图方法:

  1. dc.rectangle(x,y,w,h) - 在指定左上坐标处绘制一个矩形并给定宽度和高度。

  2. dc.arc(x,y,r,a1,a2) - 使用给定半径和两个角度绘制一个圆弧。

  3. dc.line(x1, y1, x2, y2) - 在两对坐标之间绘制一条线。

  4. dc.line_to(x,y) - 从当前位置绘制一条线到 (x,y)

  5. dc.show_text(str) - 在当前光标位置绘制字符串

  6. dc.stroke() − draws outline

  7. dc.fill() - 使用当前颜色填充形状

  8. 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()

以上的脚本会生成以下输出:

basic shapes cairo