原文: https://zetcode.com/gfx/pycairo/backends/

PyCairo 支持各种后端。 后端是可以显示 PyCairo 产生的图形的地方。 我们使用 PyCairo 创建 PNG 图像,PDF 文件,SVG 文件,然后在 GTK 窗口上绘制。

PNG 图像

在第一个示例中,我们创建一个 PNG 图像。

pngimage.py

  1. #!/usr/bin/python
  2. '''
  3. ZetCode PyCairo tutorial
  4. This program uses PyCairo to
  5. produce a PNG image.
  6. Author: Jan Bodnar
  7. Website: zetcode.com
  8. Last edited: April 2016
  9. '''
  10. import cairo
  11. def main():
  12. ims = cairo.ImageSurface(cairo.FORMAT_ARGB32, 390, 60)
  13. cr = cairo.Context(ims)
  14. cr.set_source_rgb(0, 0, 0)
  15. cr.select_font_face("Sans", cairo.FONT_SLANT_NORMAL,
  16. cairo.FONT_WEIGHT_NORMAL)
  17. cr.set_font_size(40)
  18. cr.move_to(10, 50)
  19. cr.show_text("Disziplin ist Macht.")
  20. ims.write_to_png("image.png")
  21. if __name__ == "__main__":
  22. main()

此示例是一个小型控制台应用,可创建 PNG 图像。

  1. import cairo

我们导入 PyCairo 模块。

  1. ims = cairo.ImageSurface(cairo.FORMAT_ARGB32, 390, 60)
  2. cr = cairo.Context(ims)

我们创建一个曲面,并从该曲面创建一个 Cairo 上下文。 表面是 390x60 像素的图像。

  1. cr.set_source_rgb(0, 0, 0)

我们用黑色墨水绘制文本。 墨水通过set_source_rgb()方法指定。

  1. cr.select_font_face("Sans", cairo.FONT_SLANT_NORMAL,
  2. cairo.FONT_WEIGHT_NORMAL)
  3. cr.set_font_size(40)

我们通过select_font_face()方法选择一种字体类型,并通过set_font_size()方法设置字体大小。

  1. cr.move_to(10, 50)
  2. cr.show_text("Disziplin ist Macht.")

我们将图像内的位置移至x = 10.0y = 50.0并绘制文本。

  1. ims.write_to_png("image.png")

write_to_png()方法将表面的内容写入 PNG 图像。

PyCairo 后端 - 图1

图:Gnome之眼中的 PNG 图像

PDF 文件

在第二个示例中,我们创建一个简单的 PDF 文件。

pdffile.py

  1. #!/usr/bin/python
  2. '''
  3. ZetCode PyCairo tutorial
  4. This program uses PyCairo to
  5. produce a PDF image.
  6. Author: Jan Bodnar
  7. Website: zetcode.com
  8. Last edited: April 2016
  9. '''
  10. import cairo
  11. def main():
  12. ps = cairo.PDFSurface("pdffile.pdf", 504, 648)
  13. cr = cairo.Context(ps)
  14. cr.set_source_rgb(0, 0, 0)
  15. cr.select_font_face("Sans", cairo.FONT_SLANT_NORMAL,
  16. cairo.FONT_WEIGHT_NORMAL)
  17. cr.set_font_size(40)
  18. cr.move_to(10, 50)
  19. cr.show_text("Disziplin ist Macht.")
  20. cr.show_page()
  21. if __name__ == "__main__":
  22. main()

我们必须在 PDF 查看器中打开 PDF 文件。 Linux 用户可以使用 KPDF 或 Evince 查看器。

  1. ps = cairo.PDFSurface("pdffile.pdf", 504, 648)

要渲染 PDF 文件,我们必须使用cairo.PDFSurface对象创建 PDF 曲面。 PDF 文件的大小以磅为单位指定,这是排版的标准。

  1. cr.show_page()

show_page()完成 PDF 文件的渲染。

PyCairo 后端 - 图2

图:Evince 中的 PDF 文件

SVG 文件

下一个示例创建一个简单的 SVG(可缩放矢量图形)文件。 SVG 文件是基于 XML 的文件格式。

svgfile.py

  1. #!/usr/bin/python
  2. '''
  3. ZetCode PyCairo tutorial
  4. This program uses PyCairo to
  5. produce a SVG file.
  6. Author: Jan Bodnar
  7. Website: zetcode.com
  8. Last edited: April 2016
  9. '''
  10. import cairo
  11. def main():
  12. ps = cairo.SVGSurface("svgfile.svg", 390, 60)
  13. cr = cairo.Context(ps)
  14. cr.set_source_rgb(0, 0, 0)
  15. cr.select_font_face("Sans", cairo.FONT_SLANT_NORMAL,
  16. cairo.FONT_WEIGHT_NORMAL)
  17. cr.set_font_size(40)
  18. cr.move_to(10, 50)
  19. cr.show_text("Disziplin ist Macht.")
  20. cr.show_page()
  21. if __name__ == "__main__":
  22. main()

我们可以使用网络浏览器(例如 Google Chrome)或矢量绘图程序(例如 Inkscape)打开 SVG 文件。

  1. ps = cairo.SVGSurface("svgfile.svg", 390, 60)

要在 PyCairo 中创建 SVG 文件,我们必须使用cairo.SVGSurface对象创建 SVG 表面。

  1. cr.show_page()

show_page()方法调用完成了 SVG 文件的呈现。

PyCairo 后端 - 图3

SVG file in Chrome

GTK 窗口

在最后一个示例中,我们在 GTK 窗口上绘制。 该后端将在本教程的其余部分中使用。

gtkwindow.py

  1. #!/usr/bin/python
  2. '''
  3. ZetCode PyCairo tutorial
  4. This program uses PyCairo to
  5. draw on a window in GTK.
  6. Author: Jan Bodnar
  7. Website: zetcode.com
  8. Last edited: April 2016
  9. '''
  10. from gi.repository import Gtk
  11. import cairo
  12. class Example(Gtk.Window):
  13. def __init__(self):
  14. super(Example, self).__init__()
  15. self.init_ui()
  16. def init_ui(self):
  17. darea = Gtk.DrawingArea()
  18. darea.connect("draw", self.on_draw)
  19. self.add(darea)
  20. self.set_title("GTK window")
  21. self.resize(420, 120)
  22. self.set_position(Gtk.WindowPosition.CENTER)
  23. self.connect("delete-event", Gtk.main_quit)
  24. self.show_all()
  25. def on_draw(self, wid, cr):
  26. cr.set_source_rgb(0, 0, 0)
  27. cr.select_font_face("Sans", cairo.FONT_SLANT_NORMAL,
  28. cairo.FONT_WEIGHT_NORMAL)
  29. cr.set_font_size(40)
  30. cr.move_to(10, 50)
  31. cr.show_text("Disziplin ist Macht.")
  32. def main():
  33. app = Example()
  34. Gtk.main()
  35. if __name__ == "__main__":
  36. main()

该示例弹出一个居中的 GTK 窗口,在该窗口上绘制"Disziplin ist Macht"文本。

  1. from gi.repository import Gtk
  2. import cairo

我们导入必要的 PyCairo 和 GTK 模块。

  1. darea = Gtk.DrawingArea()

我们将使用Gtk.DrawingArea小部件。

  1. darea.connect("draw", self.on_draw)

重新绘制窗口时,会发出draw信号。 我们将该信号连接到on_draw()回调。

  1. def on_draw(self, wid, cr):
  2. ...

绘图是在on_draw()方法内部完成的。 第三个参数是 Cairo 上下文。 它是自动提供给我们的; Cairo 库内置在 GTK 系统中。

PyCairo 后端 - 图4

图:GTK 窗口

在本章中,我们介绍了受支持的 PyCairo 后端。