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 中的形状和填充相关推荐

  1. PyCairo 中的文本

    PyCairo 教程的这个部分,我们将与文本打交道. 灵魂伴侣 在第一个例子中,我们将在窗口中显示一些歌词. def on_draw(self, wid, cr):cr.set_source_rgb( ...

  2. PyCairo 中的剪裁和屏蔽

    在 PyCairo 教程的这个部分,我们将讨论剪裁和屏蔽操作. 剪裁 裁剪 是将绘制限定在某一区域内.这样做有一些效率的因素,或者为了创建有趣的效果.PyCairo 有一个 clip() 方法用于设置 ...

  3. 【Tableau 设计提示8.0】在 Tableau 中使用形状的 10 个技巧

    文章目录 1 - 使用 Tableau 内置形状 2-添加您自己的自定义形状 3 - 在不重新启动 Tableau 的情况下重新加载新形状 4 - 尽可能使用透明的PNG文件 5 - 在没数据字段的情 ...

  4. WPF中的形状Shape与几何图形Geometry详解

    总目录 文章目录 总目录 一.Shape(形状) 1.Shape基本信息 2.Ellipse 1.案例 2.说明 3.Rectangle 1.案例 2.说明 4.Line 1.案例 2.说明 5.Po ...

  5. Illustrator 教程:如何在 Illustrator 中修改形状?

    欢迎观看illustrator教程,小编带大家学习 illustrator 的基本工具和使用技巧,了解如何在 illustrator 中修改形状. illustrator 提供了很多工具和编辑方法帮助 ...

  6. javaweb输出所有学生信息_遍历工作表中所有形状并输出信息

    大家好,我们今日讲解"VBA信息获取与处理"教程中第十九个专题"工作表中对SHAPE信息的获取及处理"的第1节"遍历工作表中所有形状并输出信息&quo ...

  7. c语言向表格内存入数据,怎么实现横向到存入多个单元格,在列数固定的报表中逐格横向填充数据并折行...

    在很多需要打印的报表中,受限于纸张的大小,往往会限制行数或者固定列数.我们在<单据类报表的制作>一文中,曾经介绍了限制了行数的情况如何实现,现在,我们再来看一下,在固定了列数的情况下,如果 ...

  8. 技巧 | OpenCV中如何绘制与填充多边形

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 很多人都问过我这个问题,OpenCV中 ...

  9. pandas使用fillna函数并设置fffill参数使用列中的前序值填充缺失值(replace missing values with preceding values in column in d

    pandas使用fillna函数并设置fffill参数使用列中的前序值填充缺失值(replace missing values with preceding values in column in d ...

最新文章

  1. 动态毛玻璃特效html,js和CSS3炫酷毛玻璃面板特效
  2. FileSystemObject
  3. 分库分表的几种常见形式以及可能遇到的难
  4. 使用rust编译linux,在 Ubuntu 上为 CentOS 编译 Rust 程序,
  5. 深度学习经典算法 | 蚁群算法解析
  6. webworker应用场景_典型应用场景 · OpenResty最佳实践-最新版 · 看云
  7. 【PHP学习】—PHP连接数据库实现表单页面的验证功能(七)
  8. Appium——元素定位
  9. python代码怎么变成软件_python程序变成软件的实操方法
  10. Gantt - attachEvent事件监听 - 无参数事件
  11. 使用网络协议分析仪Wireshark
  12. 红色警戒2地图编辑器研究
  13. 扯淡扯着扯着就远了----关键字;宁静致远
  14. 【Firefly云手机】最高可虚拟720台手机,支持一键操控,应用多开
  15. [sdx62]使用diff工具给开源软件包dnsmasq打patch操作方法
  16. python程序编程千分符号怎么输入_Excel表格中怎么输入千分之一符号
  17. 为什么都推崇测试先行?论软件测试先行的12个好处
  18. Forecasting (一):introduction
  19. xmlns是什么意思?
  20. 《操作系统》期末复习题

热门文章

  1. 数据库-优化-pt-kill-授权-数据
  2. Bootstrap全局css样式_表格
  3. Android万年历课程设计,电子万年历的设计(课程设计)
  4. 启动和退出mysql的三种方法_Oracle数据库几种启动和关闭方式
  5. ConditionObject源码
  6. 伦茨8400变频器面板按键说明_变频器调试笔记
  7. 【note】fill函数和memset函数的区别和使用
  8. 0R电阻的12种妙用---摘自:俸禄的小三
  9. 通用权限管理系统组件 (GPM - General Permissions Manager) - 支持请求
  10. Python类及面向对象编程【转】