Pycairo is a Python module providing bindings for the cairo graphics library. It depends on cairo >= 1.15.10 and works with Python 3.9+ and PyPy3. Pycairo, including this documentation, is licensed under the LGPL-2.1-only OR MPL-1.1.

The Pycairo bindings are designed to match the cairo C API as closely as possible, and to deviate only in cases which are clearly better implemented in a more ‘Pythonic’ way.

    pip install pycairo

Installing Pycairo requires cairo including its headers. For more info see “Getting Started”.

    import cairo

    with cairo.SVGSurface("example.svg", 200, 200) as surface:
        context = cairo.Context(surface)
        x, y, x1, y1 = 0.1, 0.5, 0.4, 0.9
        x2, y2, x3, y3 = 0.6, 0.1, 0.9, 0.5
        context.scale(200, 200)
        context.set_line_width(0.04)
        context.move_to(x, y)
        context.curve_to(x1, y1, x2, y2, x3, y3)
        context.stroke()
        context.set_source_rgba(1, 0.2, 0.2, 0.6)
        context.set_line_width(0.02)
        context.move_to(x, y)
        context.line_to(x1, y1)
        context.move_to(x2, y2)
        context.line_to(x3, y3)
        context.stroke()

Features of the Pycairo bindings:

- Provides an object oriented interface to cairo.

- Queries the error status of objects and translates them to exceptions.

- Provides a C API that can be used by other Python extensions.

- Fully typed and documented API.

For more information visit https://pycairo.readthedocs.io

PyPI:

  https://pypi.org/project/pycairo

Tarballs:

  https://github.com/pygobject/pycairo/releases

Git repo:

  https://github.com/pygobject/pycairo

Bug tracker:

  https://github.com/pygobject/pycairo/issues

Mailing list:

  https://lists.cairographics.org/cgi-bin/mailman/listinfo/cairo

See the “API Reference” for further details.

For examples of pycairo code see the ‘examples’ directory that comes with the pycairo distribution.

Alternatives:

- cairocffi provides a large subset of the pycairo API but instead of being implemented in C it uses cffi to talk to cairo. In case you’d prefer not to use a C extension then give this a try. Or if you use PyPy and want to benefit from the lower overhead of cffi compared to C extensions.

- Qahirah provides a more “pythonic” API with less focus on matching the cairo C API. It also isn’t a C extension and uses the Python builtin ctypes module to talk to cairo.