PyCairo指南的這個部分,咱們將建立一些基本的和更高級的形狀。咱們將使用單一顏色,patterns和漸變來填充他們。漸變將在另外一章中討論。 python
PyCairo有一些基本的方法能夠用來畫簡單的形狀。 web
def on_draw(self, wid, cr): cr.set_source_rgb(0.6, 0.6, 0.6) cr.rectangle(20, 20, 120, 80) cr.rectangle(180, 20, 80, 80) cr.fill() cr.arc(330, 60, 40, 0, 2 * math.pi) cr.fill() cr.arc(90, 160, 40,math.pi/4, math.pi) cr.fill() cr.translate(220, 180) cr.scale(1, 0.7) cr.arc(0, 0, 50, 0, 2 * math.pi) cr.fill()
在這個例子中,咱們將建立一個矩形,一個方形,一個圓形,一個弧形,和一個橢圓形。 ui
cr.rectangle(20, 20, 120, 80) cr.rectangle(180, 20, 80, 80)
rectangle()方法用於建立方形和矩形。一個方形就僅僅是一個特殊的矩形。 spa
cr.arc(330, 60, 40, 0, 2 * math.pi)
這一行建立一個圓形。 code
cr.arc(90, 160, 40,math.pi/4, math.pi)
這裏咱們建立一個弧形,一個圓形的一部分而已。 對象
cr.scale(1, 0.7) cr.arc(0, 0, 50, 0, 2 * math.pi)
咱們使用scale()和arc()方法來建立橢圓形。 three
Figure: Basic Shapes
圖片
其餘的形狀能夠經過將基本的元素結合起來的方式建立。 get
#!/usr/bin/python ''' ZetCode PyCairo tutorial This code example draws another three shapes in PyCairo author: Jan Bodnar website: zetcode.com last edited: August 2012 ''' import cairo import gtk class cv(object): points = ( (0, 85), (75, 75), (100, 10), (125, 75), (200, 85), (150, 125), (160, 190), (100, 150), (40, 190), (50, 125), (0, 85) ) class MainWindow(gtk.Window): def __init__(self): super(self.__class__, self).__init__() self.init_ui() def init_ui(self): self.darea = gtk.DrawingArea() self.darea.connect("expose_event", self.expose) self.add(self.darea) self.set_title("Complex shapes") self.resize(480, 240) self.set_position(gtk.WIN_POS_CENTER) self.connect("delete-event", gtk.main_quit) self.show_all() def expose(self, widget, event): self.context = widget.window.cairo_create() self.on_draw(480, self.context) def on_draw(self, wid, cr): cr.set_source_rgb(0.6, 0.6, 0.6) cr.set_line_width(1) for i in range(10): cr.line_to(cv.points[i][0], cv.points[i][1]) cr.fill() cr.move_to(240, 40) cr.line_to(240, 160) cr.line_to(350, 160) cr.fill() cr.move_to(380, 40) cr.line_to(380, 160) cr.line_to(450, 160) cr.curve_to(440, 155, 380, 145, 380, 40) cr.fill() def main(): window = MainWindow() gtk.main() if __name__ == "__main__": main()
這個例子中,咱們建立了一個五角星對象,一個三角形和一個改良的三角形。這些對象使用一些直線和一條曲線建立。 it
for i in range(10): cr.line_to(cv.points[i][0], cv.points[i][1]) cr.fill()
五角星經過交合點的元組中全部的點來畫。fill()方法使用當前色彩填充五角星對象。
cr.move_to(240, 40) cr.line_to(240, 160) cr.line_to(350, 160) cr.fill()
這些線建立一個三角形。最後兩個點由PyCairo自動的鏈接起來。
cr.move_to(380, 40) cr.line_to(380, 160) cr.line_to(450, 160) cr.curve_to(440, 155, 380, 145, 380, 40) cr.fill()
改良的三角形是兩條直線和一條曲線的簡單的結合。
Figure: Complex shapes
一個顏色是一個結合了紅,綠和藍(RGB)亮度的對象。PyCairo有效的RGB值在0到1範圍內。
def on_draw(self, wid, cr): cr.set_source_rgb(0.2, 0.23, 0.9) cr.rectangle(10, 15, 90, 60) cr.fill() cr.set_source_rgb(0.9, 0.1, 0.1) cr.rectangle(130, 15, 90, 60) cr.fill() cr.set_source_rgb(0.4, 0.9, 0.4) cr.rectangle(250, 15, 90, 60) cr.fill()
在這個例子中,咱們畫了三個彩色的矩形。
cr.set_source_rgb(0.2, 0.23, 0.9) cr.rectangle(10, 15, 90, 60) cr.fill()
set_source_rgb()方法設置source爲一個不透明的顏色。參數爲紅,綠,藍亮度值。經過調用fill()方法,source被用於填充矩形的內部。
Figure: Solid colors
Patterns是複雜的可用於填充形狀的圖像對象。
#!/usr/bin/python ''' ZetCode PyCairo tutorial This program shows how to work with patterns in PyCairo author: Jan Bodnar website: zetcode.com last edited: August 2012 ''' import cairo import gtk class MainWindow(gtk.Window): def __init__(self): super(self.__class__, self).__init__() self.init_ui() self.create_surpat() def init_ui(self): self.darea = gtk.DrawingArea() self.darea.connect("expose_event", self.expose) self.add(self.darea) self.set_title("Patterns") self.resize(300, 290) self.set_position(gtk.WIN_POS_CENTER) self.connect("delete-event", gtk.main_quit) self.show_all() def create_surpat(self): sr1 = cairo.ImageSurface.create_from_png("blueweb.png") sr2 = cairo.ImageSurface.create_from_png("maple.png") sr3 = cairo.ImageSurface.create_from_png("crack.png") sr4 = cairo.ImageSurface.create_from_png("chocolate.png") self.pt1 = cairo.SurfacePattern(sr1) self.pt1.set_extend(cairo.EXTEND_REPEAT) self.pt2 = cairo.SurfacePattern(sr2) self.pt2.set_extend(cairo.EXTEND_REPEAT) self.pt3 = cairo.SurfacePattern(sr3) self.pt3.set_extend(cairo.EXTEND_REPEAT) self.pt4 = cairo.SurfacePattern(sr4) self.pt4.set_extend(cairo.EXTEND_REPEAT) def expose(self, widget, event): self.context = widget.window.cairo_create() self.on_draw(300, self.context) def on_draw(self, wdith, cr): cr.set_source(self.pt1) cr.rectangle(20, 20, 100, 100) cr.fill() cr.set_source(self.pt2) cr.rectangle(150, 20, 100, 100) cr.fill() cr.set_source(self.pt3) cr.rectangle(20, 140, 100, 100) cr.fill() cr.set_source(self.pt4) cr.rectangle(150, 140, 100, 100) cr.fill() def main(): window = MainWindow() gtk.main() if __name__ == "__main__": main()
在這個例子中,咱們畫了四個矩形。此次咱們用一些patterns來填充它們。咱們使用了來自於Gimp圖像管理程序的四個patterns圖像。咱們必須保持那些patterns的原始大小,由於咱們將要展開他們。
咱們在draw()方法外面建立圖像surface。每次窗口須要重畫的時候,都從硬盤來讀取是很是沒有效率的。
sr1 = cairo.ImageSurface.create_from_png("blueweb.png")用一幅PNG圖像建立一個圖像surface。
self.pt1 = cairo.SurfacePattern(sr1) self.pt1.set_extend(cairo.EXTEND_REPEAT)由surface建立一個pattern。咱們設置風格爲 cairo.EXTEND_REPEAT,這將使得pattern以重複的方式展開。
cr.set_source(self.pt1) cr.rectangle(20, 20, 100, 100) cr.fill()
此處咱們繪製咱們的第一個矩形。set_source()方法告訴Cairo上下文,在畫的時候,使用一個pattern做爲一個source。圖像模式可能不徹底適合那個形狀。rectangle()建立一個矩形的path。最後,fill()方法用source來填充path。
上面的那段code中所用到的四幅圖片。
blueweb.png chocolate.png crack.png maple.png
上面那段code,執行的結果。
本章中咱們討論了PyCairo的形狀和填充。