PyGTK - DrawingArea 类

  • 简述

    DrawingArea 小部件呈现一个包含 gtk.gdk.Window 的空白画布,在该画布上可以绘制线条、矩形、弧线等对象。
    PyGTK 使用 Cairo 库进行此类绘图操作。Cairo 是一个流行的 2D 矢量图形库。它是用 C 编写的,尽管它与大多数语言(如 C++、Java、Python、PHP 等)都有绑定。Cairo 库可用于在各种操作系统的标准输出设备上绘图。它还可用于创建 PDF、SVG 和后期脚本文件。
    为了执行不同的绘图操作,我们必须在目标输出对象的文本上获取设备。在这种情况下,由于绘图出现在 gtk.DrawingArea 小部件上,因此获取其中包含的 gdk.Window 的设备上下文。这个类有一个cairo-create()返回设备上下文的方法。
    
    area = gtk.DrawingArea()
    dc = area.window.cairo_create()
    
    DrawingArea 小部件可以根据它发出的以下信号连接到回调 -
    Realize 在特定显示器上实例化小部件时采取任何必要的操作。
    configure_event 在小部件更改大小时采取任何必要的操作。
    expose_event 当绘图区域首次出现在屏幕上时,或者当它被另一个窗口覆盖然后又被覆盖(暴露)时,处理重绘小部件的内容。
    鼠标和键盘事件也可用于通过以下方式调用回调add_events() methodgtk.Widget class.
    特别感兴趣的是在 DrawingArea 画布第一次出现时发出的暴露事件信号。在 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) - 将颜色设置为轮廓并用 0.0 到 1.0 之间的 r、g 和 b 值填充
  • 例子

    以下脚本使用 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() 
    
    上面的脚本将生成以下输出 -
    基本形状开罗