Cairo 图形指南 for Python (3) —— Cairo 后端
Tofloor
poster avatar
lovesnow
deepin
2011-12-08 12:43
Author
Cairo 支持多种后端,Cairo 支持多种后端,本文基于几个示例讲述如何使用 Cairo 各种后端创建 PNG 图像、PDF 文件与 SVG 文件以及如何使用 Cairo 在 GTK 窗口中绘图。
1. PNG 图像第一个示例 (example-1.c) 用于生成 PNG 图像。
  1. import cairo
  2. surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 320, 48)
  3. cr = cairo.Context(surface)
  4. cr.set_source_rgb(0.627, 0, 0)
  5. cr.select_font_face('Monospace', cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL)
  6. cr.set_font_size(24.0)
  7. cr.move_to(10.0, 34.0)
  8. cr.show_text("最好的用的Linux-linux deepin")
  9. surface.write_to_png('image.png')
Copy the Code

效果图:
image.png_001.png


这个示例是一个很小的控制台程序,运行后可生成一份 PNG 图像文件。

2. PDF 文件在第二个示例 (example-2.c) 中,将使用 Cairo 生成一份 PDF 文件,其内容与第一个示例所生成的图像是相同的。
  1. import cairo
  2. surface = cairo.PDFSurface("pdffile.pdf", 320, 48)
  3. cr = cairo.Context(surface)
  4. cr.set_source_rgb(0.627, 0 ,0)
  5. cr.select_font_face('Monospace', cairo.FONT_SLANT_ITALIC, cairo.FONT_WEIGHT_BOLD)
  6. cr.set_font_size(24.0)
  7. cr.move_to(10.0, 34.0)
  8. cr.show_text("深度Linux,值得深入")
  9. cr.show_page()
Copy the Code

3. SVG 文件第三个示例演示如何使用 Cairo SVG 后端生成一份简单的 SVG (Scalble Vector Graphics) 文件。SVG 技术近几年很热门。
  1. import cairo
  2. surface = cairo.SVGSurface('svgfile.svg', 320, 48)
  3. cr = cairo.Context(surface)
  4. cr.set_source_rgb(0.627, 0, 0)
  5. cr.select_font_face('Monospace', cairo.FONT_SLANT_ITALIC,
  6.         cairo.FONT_WEIGHT_BOLD)
  7. cr.set_font_size(24.0)
  8. cr.move_to(10.0, 34.0)
  9. cr.show_text("深度Linux,值得您深入!")
Copy the Code



4. 在最后这个示例中,演示如何在 GTK 窗口中使用 Cairo 绘制图形。基于 GTK 后端的 Cairo 绘图模型将贯穿于本指南。
  1. import pygtk
  2. pygtk.require('2.0')
  3. import gtk
  4. class CairoText:
  5.     def __init__(self):
  6.         self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  7.         self.window.connect('expose_event', self.on_expose_event)
  8.         self.window.connect('destroy', lambda w: gtk.main_quit())
  9.         self.window.set_position(gtk.WIN_POS_CENTER)
  10.         self.window.set_default_size( 320, 48)
  11.         self.window.set_app_paintable(True)
  12.         self.window.show_all()
  13.    
  14.     def on_expose_event(self, widget, event,  data=None):
  15.         cr = widget.window.cairo_create()
  16.         cr.set_source_rgb(0.627, 0, 0)
  17.         cr.set_font_size(24.0)
  18.         cr.move_to(10.0, 34.0)
  19.         cr.show_text('Linux Deepin')
  20.    
  21. def main():
  22.     gtk.main()
  23. if __name__ == '__main__':
  24.     CairoText()
  25.     main()
  26.    
Copy the Code

这个示例程序运行后,会在屏幕中央跳出一个 GTK+ 窗口,上面绘制了一串文本,如下图所示:
window 7下运行效果:
QQ截图20111208041701.png

Linux deepin下运行效果:
linuxd.png


首先要import gtk库
  1. import gtk
Copy the Code

当 GTK+窗口被重绘时,会发出 expose-event 信号,我们可将这一信号连接到 on_expose_event () 回调函数上。
  1. self.window.connect('expose_event', self.on_expose_event)
Copy the Code

要在 GTK+ 窗口中绘制 Cairo 图形,可以使用 GtkDrawingArea widget 或者更为简单的 GtkWindow widget,本例选择 GtkWindow 。由 GtkWindow widget 对 expose-event 信号处理后,默认要重新绘制窗口背景,这会将我们在 on_expose_event () 函数中定义的 Cairo 图形覆盖掉,因此需要调用 widget_set_app_paintable () 函数通知 GTK+ 不要这么干。如果是在 GtkDrawingArea widget 中绘制 Cairo 图形,则可省区这一步。
  1. self.window.set_app_paintable(True)
Copy the Code

最后Cairo 图形绘制工作是在 on_expose_event () 函数中进行的,在该函数中,我们为 GTK+ 系统创建了一个 Cairo 环境,并在该环境中绘制了一行文本。 :roll:
Reply Favorite View the author
All Replies

No replies yet