PyCairo 后端
最后修改于 2023 年 7 月 17 日
PyCairo 支持各种后端。后端是 PyCairo 生成的图形可以显示的地方。我们使用 PyCairo 创建 PNG 图像、PDF 文件、SVG 文件,并在 GTK 窗口上绘图。
PNG 图像
在第一个示例中,我们创建一个 PNG 图像。
#!/usr/bin/python ''' ZetCode PyCairo tutorial This program uses PyCairo to produce a PNG image. Author: Jan Bodnar Website: zetcode.com ''' import cairo def main(): ims = cairo.ImageSurface(cairo.FORMAT_ARGB32, 390, 60) cr = cairo.Context(ims) cr.set_source_rgb(0, 0, 0) cr.select_font_face("Sans", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL) cr.set_font_size(40) cr.move_to(10, 50) cr.show_text("Disziplin ist Macht.") ims.write_to_png("image.png") if __name__ == "__main__": main()
这个示例是一个小型控制台应用程序,用于创建 PNG 图像。
import cairo
我们导入 PyCairo 模块。
ims = cairo.ImageSurface(cairo.FORMAT_ARGB32, 390, 60) cr = cairo.Context(ims)
我们从表面创建一个表面和一个 Cairo 上下文。该表面是一个 390x60 像素的图像。
cr.set_source_rgb(0, 0, 0)
我们用黑色墨水绘制文本。墨水通过 `set_source_rgb` 方法指定。
cr.select_font_face("Sans", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL) cr.set_font_size(40)
我们使用 `select_font_face` 方法选择字体类型,并使用 `set_font_size` 方法设置字体大小。
cr.move_to(10, 50) cr.show_text("Disziplin ist Macht.")
我们将位置移动到图像内的 x=10.0, y=50.0,然后绘制文本。
ims.write_to_png("image.png")
`write_to_png` 方法将表面的内容写入 PNG 图像。

PDF 文件
在第二个示例中,我们创建一个简单的 PDF 文件。
#!/usr/bin/python ''' ZetCode PyCairo tutorial This program uses PyCairo to produce a PDF image. Author: Jan Bodnar Website: zetcode.com ''' import cairo def main(): ps = cairo.PDFSurface("pdffile.pdf", 504, 648) cr = cairo.Context(ps) cr.set_source_rgb(0, 0, 0) cr.select_font_face("Sans", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL) cr.set_font_size(40) cr.move_to(10, 50) cr.show_text("Disziplin ist Macht.") cr.show_page() if __name__ == "__main__": main()
我们必须在 PDF 查看器中打开 PDF 文件。Linux 用户可以使用 KPDF 或 Evince 查看器。
ps = cairo.PDFSurface("pdffile.pdf", 504, 648)
要渲染 PDF 文件,我们必须使用 `cairo.PDFSurface` 对象创建一个 PDF 表面。PDF 文件的大小以点为单位指定,这是排版中的标准。
cr.show_page()
`show_page` 完成 PDF 文件的渲染。

SVG 文件
下一个示例创建了一个简单的 SVG(可缩放矢量图形)文件。SVG 文件是基于 XML 的文件格式。
#!/usr/bin/python ''' ZetCode PyCairo tutorial This program uses PyCairo to produce a SVG file. Author: Jan Bodnar Website: zetcode.com ''' import cairo def main(): ps = cairo.SVGSurface("svgfile.svg", 390, 60) cr = cairo.Context(ps) cr.set_source_rgb(0, 0, 0) cr.select_font_face("Sans", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL) cr.set_font_size(40) cr.move_to(10, 50) cr.show_text("Disziplin ist Macht.") cr.show_page() if __name__ == "__main__": main()
我们可以使用 Google Chrome 等网页浏览器或 Inkscape 等矢量绘图程序打开 SVG 文件。
ps = cairo.SVGSurface("svgfile.svg", 390, 60)
要在 PyCairo 中创建 SVG 文件,我们必须使用 `cairo.SVGSurface` 对象创建一个 SVG 表面。
cr.show_page()
`show_page` 方法调用完成 SVG 文件的渲染。

GTK 窗口
在最后一个示例中,我们在 GTK 窗口上绘图。此后端将在教程的其余部分中使用。
#!/usr/bin/python ''' ZetCode PyCairo tutorial This program uses PyCairo to draw on a window in GTK. Author: Jan Bodnar Website: zetcode.com ''' from gi.repository import Gtk import cairo 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("GTK window") self.resize(420, 120) 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, 0, 0) cr.select_font_face("Sans", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL) cr.set_font_size(40) cr.move_to(10, 50) cr.show_text("Disziplin ist Macht.") def main(): app = Example() Gtk.main() if __name__ == "__main__": main()
该示例弹出一个居中的 GTK 窗口,我们在其中绘制“Disziplin ist Macht”文本。
from gi.repository import Gtk import cairo
我们导入必要的 PyCairo 和 GTK 模块。
darea = Gtk.DrawingArea()
我们在 `Gtk.DrawingArea` 小部件上绘图。
darea.connect("draw", self.on_draw)
当窗口重绘时,会发出一个 `draw` 信号。我们将该信号连接到 `on_draw` 回调。
def on_draw(self, wid, cr): ...
绘图在 `on_draw` 方法内完成。第三个参数是 cairo 上下文。它对我们来说是自动可用的;Cairo 库内置于 GTK 系统中。

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