Cairo 图形指南 for Python (4) —— 基本绘图
Tofloor
poster avatar
lovesnow
deepin
2011-12-13 18:19
Author
这一部分讲述如何绘制一些简单的图元,包括直线、填充与笔画操作、虚线、线端(Cap)与线的交合等图形的绘制方法。
直线段直线段是非常基础的矢量图形对象。

画一条直线段,需要调用两个函数:cairo.move_to() 函数,用于设置线段起点;cairo.line_to() 用于设定线段终点。

1. 描绘 (Stroke) 与填充 (Fill)描绘 (Stroke) 可以绘制形状的轮廓,填充 (Fill) 则用于向形状内部灌注颜色。
  1. import pygtk
  2. pygtk.require('2.0')
  3. import gtk
  4. import math
  5. class ArcWindow:
  6.     ''' create ArcWindow '''
  7.    
  8.     def __init__(self):
  9.         ''' Init '''
  10.         self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  11.         self.window.set_size_request(800, 600)
  12.         self.window.set_title('ArcWindow')
  13.         self.window.set_position(gtk.WIN_POS_CENTER)
  14.         self.window.set_app_paintable(True)
  15.         
  16.         # handler
  17.         self.window.connect('destroy', lambda w: gtk.main_quit())
  18.         self.window.connect('expose-event', self.onExposeEvent)
  19.         # Show window
  20.         self.window.show()
  21.         # goto the main
  22.         gtk.main()
  23.     def onExposeEvent(self, widget, event):
  24.         width, height = widget.window.get_size()
  25.         cr = widget.window.cairo_create()
  26.         cr.set_line_width(9)
  27.         cr.set_source_rgb(0.69,0.19,0)
  28.         cr.arc(width / 2, height / 2, (radius if widget < height else height)/2-10, 0, 2*math.pi)
  29.         cr.stroke_preserve()
  30.         cr.set_source_rgb(0.3,0.4,0.6)
  31.         cr.fill()
  32. if __name__ == '__main__':
  33.     ArcWindow()
Copy the Code

效果图:
arc.png

下面对代码进行解析:
  1.         cr.set_source_rgb(0.69,0.19,0)
  2.         cr.arc(width / 2, height / 2, (radius if widget < height else height)/2-10, 0, 2*math.pi)
  3.         cr.stroke_preserve()
Copy the Code
描绘圆的轮廓。这里要注意一下 cairo.stroke_preserve () 函数与 cairo.stroke () 函数的区别(最好的办法是用后者替换一下前者,看看程序执行效果)。cairo.stroke_preserve () 函数会将它绘制的路径依然保存在 cairo 环境中,而 cairo.stroke () 所绘制的路径,在绘制完成后,就从 cairo的环境中清除了。
Reply Favorite View the author
All Replies
hfy1991
deepin
2011-12-28 20:08
#1
楼主辛苦了,总结不易,顶一个先 :!:
本人还苦于python基础阶段,想弱弱的问个问题
python的类定义和其每个函数下都有一个三引号是注释用的么,能不打的吧
比如构造函数:
def __init__(self):
        ''' Init '''
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_size_request(800, 600)
        self.window.set_title('ArcWindow')
        self.window.set_position(gtk.WIN_POS_CENTER)
        self.window.set_app_paintable(True)
中的 ''' Init '''
Reply View the author
newsteng
deepin
2011-12-31 07:19
#2
回复2楼,我也是新手,三个单引号的是注释
Reply View the author
yfwz100
deepin
2012-01-06 16:28
#3
改了一个Gtk+ 3.0的版本……
另外,函数定义下的''‘ description '''是文档注释的意思,类似于Java doc。
  1. import gi
  2. gi.require_version("Gtk", "3.0")
  3. gi.require_version("cairo", "1.0")
  4. from gi.repository import Gtk, cairo
  5. import math
  6. class ArcWindow:
  7.     def __init__(self):
  8.         self.window = Gtk.Window()
  9.         self.window.set_title('ArcWindow')
  10.         self.window.set_size_request(200, 200)
  11.         self.window.set_app_paintable(True)
  12.         self.window.connect("destroy", lambda w: Gtk.main_quit())
  13.         self.window.connect('draw', self.on_paint)
  14.         self.window.show()
  15.         Gtk.main()
  16.     def on_paint(self, widget, cr):
  17.         width, height = self.window.get_size()
  18.         cr.set_line_width(9)
  19.         cr.set_source_rgb(0.69, 0.19, 0)
  20.         cr.arc(width/2, height/2, (width if width        cr.stroke_preserve()
  21.         cr.set_source_rgb(0.3, 0.4, 0.6)
  22.         cr.fill()
  23. if __name__ == '__main__':
  24.     ArcWindow()
Copy the Code
Reply View the author
hfy1991
deepin
2012-01-17 00:34
#4
回复2楼,我也是新手,三个单引号的是注释
刚刚才学到这部分,这是文档化字符串,可通过print ClassName._doc_来查看
python注释是#
Reply View the author