You are here:Home » PyCairo » PyCairo backends

PyCairo backends

PyCairo backends

PyCairo supports various backends. Backends are places where the graphics produced by PyCairo can be displayed. We will use PyCairo to create a PNG image, a PDF file, a SVG file and we will draw on a GTK window.

PNG image

In the first example, we will create a PNG image.
#!/usr/bin/python

'''
ZetCode PyCairo tutorial

This program uses PyCairo to
produce a PNG image.

author: Jan Bodnar
website: zetcode.com
last edited: August 2012
'''

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()
This example is a small console application that will create a PNG image.
import cairo
We import the PyCairo module.
ims = cairo.ImageSurface(cairo.FORMAT_ARGB32, 390, 60)
cr = cairo.Context(ims)
We create a surface and a Cairo context from the surface. The surface is a 390x60px image.
cr.set_source_rgb(0, 0, 0)
We will draw our text in black ink.
cr.select_font_face("Sans", cairo.FONT_SLANT_NORMAL,
cairo.FONT_WEIGHT_NORMAL)
cr.set_font_size(40)
We choose a font type and set its size.
cr.move_to(10, 50)
cr.show_text("Disziplin ist Macht.")
We move to a x=10.0, y=50.0 position within the image and draw the text.
ims.write_to_png("image.png")
This method call creates the PNG image.
PNG image in Eye of Gnome
Figure: PNG image in Eye of Gnome

PDF file

In the second example, we create a simple PDF file.
#!/usr/bin/python

'''
ZetCode PyCairo tutorial

This program uses PyCairo to
produce a PDF image.

author: Jan Bodnar
website: zetcode.com
last edited: August 2012
'''

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()
We must open the pdf file in a pdf viewer. Linux users can use KPDF or Evince viewers.
ps = cairo.PDFSurface("pdffile.pdf", 504, 648)
To render a pdf file, we must create a pdf surface using the cairo.PDFSurface object. The size of the pdf file is specified in points, which is a standard in typesetting.
cr.show_page()
The show_page() finishes rendering of the pdf file.
PDF file in Evince
Figure: PDF file in Evince

SVG file

The next example creates a simple SVG (Scalable Vector Graphics) file. A SVG file is a XML based file format.
#!/usr/bin/python

'''
ZetCode PyCairo tutorial

This program uses PyCairo to
produce a SVG file.

author: Jan Bodnar
website: zetcode.com
last edited: August 2012
'''

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()
We can use a web browser like Google Chrome or a vector drawing program like Inkscape to open a SVG file.
ps = cairo.SVGSurface("svgfile.svg", 390, 60)
To create a SVG file in PyCairo, we must create a svg surface using the cairo.SVGSurface object.
cr.show_page()
The show_page() method call finisheds rendering of the SVG file.
SVG file in Chrome
SVG file in Chrome

GTK Window

In the last example, we will draw on a GTK window. This backend will be used throughout the rest of the tutorial.
#!/usr/bin/python

'''
ZetCode PyCairo tutorial

This program uses PyCairo to
draw on a window in GTK.

author: Jan Bodnar
website: zetcode.com
last edited: August 2012
'''


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()
The example pops up a centered GTK window, on which we draw the "Disziplin ist Macht" text.
from gi.repository import Gtk
import cairo
We import the necessary PyCairo and GTK modules.
darea = Gtk.DrawingArea()
We will be drawing on a Gtk.DrawingArea widget.
darea.connect("draw", self.on_draw)
When the window is redrawn, a draw signal is emitted. We connect that signal to the on_draw() callback.
def on_draw(self, wid, cr):
...
The drawing is done inside the on_draw() method. The third parameter is the cairo context. It is automatically available to us. The Cairo library is built into the GTK system.
GTK window
Figure: GTK window
In this chapter we have covered supported PyCairo backends.

0 comments:

Post a Comment