PyCairo 中的形状和填充
PyCairo 教程的這個部分,我們創建一些基本的和更高級的形狀。我們使用純色,模式和漸變填充這些形狀。漸變將在另一章中討論。
基本形狀
PyCairo 有一些基本的方法可以用來繪制簡單的形狀。
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()在這個例子中,我們創建一個矩形,一個方形,一個圓形,一個弧形,和一個橢圓形。
cr.rectangle(20, 20, 120, 80)cr.rectangle(180, 20, 80, 80)rectangle() 方法用于創建方形和矩形。方形僅是特殊類型的矩形。參數是左上角在窗口中的 x 和 y 坐標及矩形的寬度和高度。
cr.arc(330, 60, 40, 0, 2 * math.pi)arc() 方法創建一個圓形。參數是弧心的 x 和 y 坐標,半徑,起始和結束角度,以弧度數表示。
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() 方法創建橢圓形。
圖:基本形狀
其它形狀可以通過組合基本元素創建。
#!/usr/bin/python''' ZetCode PyCairo tutorialThis code example draws another three shapes in PyCairo.Author: Jan Bodnar Website: zetcode.com Last edited: April 2016 '''import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk import cairoclass 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 Example(Gtk.Window):def __init__(self):super(Example, self).__init__()self.init_ui()def init_ui(self):darea = Gtk.DrawingArea()darea.connect("draw", self.on_draw)self.add(darea)self.set_title("Complex shapes")self.resize(460, 240)self.set_position(Gtk.WindowPosition.CENTER)self.connect("delete-event", Gtk.main_quit)self.show_all()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():app = Example()Gtk.main()if __name__ == "__main__":main()在這個例子中,我們創建了一個星星對象,一個三角形和一個變形的三角形。這些對象使用一些直線和一條曲線創建。
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()這些直線創建一個三角形。最后兩個點自動連接。
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()變形的三角形是兩條直線和一條曲線的簡單組合。
圖:復雜形狀
填充
填充填充形狀的內部。填充可以是純色,模式或漸變。
純色
顏色是表示紅,綠和藍 (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 被用于填充矩形內部。
圖:純色
模式
模式是可用于填充形狀的復雜圖形對象。
#!/usr/bin/python''' ZetCode PyCairo tutorialThis program shows how to work with patterns in PyCairo.Author: Jan Bodnar Website: zetcode.com Last edited: April 2016 '''import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk import cairoclass Example(Gtk.Window):def __init__(self):super(Example, self).__init__()self.init_ui()self.create_surpat()def init_ui(self):darea = Gtk.DrawingArea()darea.connect("draw", self.on_draw)self.add(darea)self.set_title("Patterns")self.resize(300, 290)self.set_position(Gtk.WindowPosition.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 on_draw(self, wid, 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():app = Example()Gtk.main()if __name__ == "__main__":main()在這個例子中,我們繪制了四個矩形。這次我們用一些模式填充它們。我們使用了來自 Gimp 圖像管理程序的四個模式圖像。我們必須保持那些模式的原始大小,因為我們將展開他們。
我們在 draw() 方法外面創建圖像 surface。每次窗口需要重繪時,都從硬盤讀取不是很高效。
sr1 = cairo.ImageSurface.create_from_png("blueweb.png")圖像 surface 用一幅 PNG 圖像創建。
self.pt1 = cairo.SurfacePattern(sr1)self.pt1.set_extend(cairo.EXTEND_REPEAT)模式由 surface 創建。我們把模式設置為 cairo.EXTEND_REPEAT,這將使得模式以重復的方式展開。
cr.set_source(self.pt1)cr.rectangle(20, 20, 100, 100)cr.fill()此處我們繪制我們的第一個矩形。set_source() 方法告訴Cairo 上下文,在繪制的時候使用模式作為 source。圖像模式可能不完全適合形狀。rectangle() 創建一個矩形 path。最后,fill() 方法用 source 填充 path。
上面那段代碼中所用到的四幅圖片。
代碼的執行效果如下:
本章討論了 PyCairo 的形狀和填充。
原文
Done.
總結
以上是生活随笔為你收集整理的PyCairo 中的形状和填充的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Harfbuzz API 基本用法
- 下一篇: PyCairo渐变