PyCairo指南--后端

PyCairo后端

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
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("Diszip 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)

我们创建一个surface,并由这个surface创建一个cairo上下文。这个Surface是一幅390×60px的图像。

    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("Diszip ist Macht.")

我们移动到图像的x=10.0,y=50.0位置,并绘制文字。

    ims.write_to_png("image.png")

这个方法调用创建PNG图像。

PyCairo指南--后端_第1张图片

Figure: PNG image in Image Viewer

PDF 文件

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

#!/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("Diszip ist Macht.")
    cr.show_page()
    
if __name__ == "__main__":
    main()
    

我们必须在一个pdf viewer中打开一个pdf文件。Linux用户可以使用KPDF或者Evince viewers。

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

为了渲染一个pdf文件,我们必须使用cairo.PDFSurface对象来创建一个pdf surface。pdf文件的大小以点为单位来指定,这也是排字的一个标准。

    cr.show_page()

show_page()结束对于pdf文件的渲染。

PyCairo指南--后端_第2张图片

Figure: PDF file in Document Viewer

SVG 文件

在下一个例子中创建一个简单的SVG(Scalable Vector Graphics)文件。SVG文件是一个基于XML的文件格式。

#!/usr/bin/python
'''
ZetCode PyCairo tutorial

This program uses PyCairo to 
produce a SVG image.

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("Diszip ist Macht.")
    cr.show_page()
    
if __name__ == "__main__":
    main()
    

我们可以使用一个web浏览器,比如Google Chrome或者一个向量绘图程序,比如Inkscape来打开一个SVG文件。

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

在PyCairo中创建一个SVG文件,我们必须使用cairo.SVGSurface对象创建一个svg surface。

    cr.show_page()

show_page()方法的调用结束对SVG文件的渲染。PyCairo指南--后端_第3张图片

Figure:SVG file in Chrome

GTK窗口

在最后一个例子中,我们将在一个GTK窗口中进行绘制。这个后端也将被用于被指南后面的所有的例子中。

#!/usr/bin/python
'''
ZetCode PyCairo tutorial

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

author: wolf-cs
website: http://my.oschina.net/wolfcs/blog
last edited: May 2013
'''

import gtk
import cairo

class Example(gtk.Window):
    def __init__(self):
        super(Example, self).__init__()
        self.init_ui()
        print "Example: " + str(self)
        
    def init_ui(self):
        darea = gtk.DrawingArea()
        darea.connect("expose_event", self.expose)
        self.add(darea)

        self.set_title("GTK window")
        self.resize(420, 120)
        self.set_position(gtk.WIN_POS_CENTER)
        
        self.connect("delete-event", gtk.main_quit)
        self.show_all()
        
    def expose(self, widget, event):
        self.context = widget.window.cairo_create()
        self.on_draw(420, self.context)
        print "expose: " + str(widget)
        
    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("Diszip ist Macht.")
        
def main():
    window = Example()

    gtk.main()
        
if __name__ == "__main__":
    main()

这个例子弹出一个位于屏幕中央的GTK窗口,该窗口中绘制有内容为"Disziplin ist Macht"的文字。

import gtk
import cairo

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

        darea = gtk.DrawingArea()

我们将会在一个gtk.DrawingArea widget上进行绘制。

        darea.connect("expose_event", self.expose)

当一个窗口被重绘的时候,会产生一个expose_event信号。我们将那个信号连接到expose()回调。

    def expose(self, widget, event):
        self.context = widget.window.cairo_create()
        self.on_draw(420, self.context)

expose()回调中,我们创建cairo context。然后,绘制的动作在on_draw()方法的内部完成。第三个参数是cairo上下文,由expose()创建。Cairo库是GTK系统内建的。

PyCairo指南--后端_第4张图片

Figure: GTK window

本章中,我们已经覆盖了PyCairo所支持的所有的后端了。

你可能感兴趣的:(python,graphics,cairo)