[翻譯]PyCairo指南--形狀和填充

PyCairo中的形狀和填充

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的形狀和填充。

相關文章
相關標籤/搜索