原文: http://zetcode.com/gui/pygtk/pangoII/

在 PyGTK 编程教程的这一部分中,我们将继续探索 Pango 库。

动画文字

下面的示例在窗口上显示动画文本。

animation.py

  1. #!/usr/bin/python
  2. # ZetCode PyGTK tutorial
  3. #
  4. # This example shows animated text
  5. #
  6. # author: jan bodnar
  7. # website: zetcode.com
  8. # last edited: February 2009
  9. import gtk
  10. import glib
  11. import pango
  12. import math
  13. class PyApp(gtk.Window):
  14. def __init__(self):
  15. super(PyApp, self).__init__()
  16. self.connect("destroy", gtk.main_quit)
  17. glib.timeout_add(160, self.on_timer)
  18. self.count = 1
  19. self.set_border_width(10)
  20. self.set_title("ZetCode")
  21. self.label = gtk.Label("ZetCode")
  22. fontdesc = pango.FontDescription("Serif Bold 30")
  23. self.label.modify_font(fontdesc)
  24. vbox = gtk.VBox(False, 0)
  25. vbox.add(self.label)
  26. self.add(vbox)
  27. self.set_size_request(300, 250)
  28. self.set_position(gtk.WIN_POS_CENTER)
  29. self.show_all()
  30. def on_timer(self):
  31. attr = pango.AttrList()
  32. self.count = self.count + 1
  33. for i in range(7):
  34. r = pango.AttrRise(int(math.sin(self.count+i)*20)*pango.SCALE, i, i+1)
  35. attr.insert(r)
  36. self.label.set_attributes(attr)
  37. return True
  38. PyApp()
  39. gtk.main()

在上面的代码示例中,标签小部件中有一个文本。 通过不断更改其 pango 属性,可以对文本进行动画处理。

  1. self.label = gtk.Label("ZetCode")
  2. fontdesc = pango.FontDescription("Serif Bold 30")
  3. self.label.modify_font(fontdesc)

我们创建标签小部件并修改其字体。 我们选择较大的文本以提高可见性。

  1. vbox = gtk.VBox(False, 0)
  2. vbox.add(self.label)

我们将标签放入垂直框中。 这将标签居中在窗口上。

动画在on_timer()方法内部执行。

  1. for i in range(7):
  2. r = pango.AttrRise(int(math.sin(self.count+i)*20)*pango.SCALE, i, i+1)
  3. attr.insert(r)

我们的文字中有七个字符。 我们会定期更改每个角色的 pango AttrRise属性。 上升基于三角正弦函数。 文本移动遵循在笛卡尔图上绘制的正弦函数。

另请注意pango.SCALE常数。 Pango 库有自己的单元。 它们与小部件用来绘制图形或文本的方式不同。 我们必须用这个常数乘数字。

Pango II - 图1

图:动画文本

使用标记语言

我们可以使用内置的标记语言来更改文本的属性。

markup.py

  1. #!/usr/bin/python
  2. # ZetCode PyGTK tutorial
  3. #
  4. # This example uses markup language
  5. # to change attributes of the text
  6. #
  7. # author: jan bodnar
  8. # website: zetcode.com
  9. # last edited: February 2009
  10. import gtk
  11. import pango
  12. quote = "<span foreground='blue' size='19000'>The only victory over love is flight</span>"
  13. class PyApp(gtk.Window):
  14. def __init__(self):
  15. super(PyApp, self).__init__()
  16. self.set_title("Markup")
  17. self.set_border_width(5)
  18. self.connect("destroy", gtk.main_quit)
  19. label = gtk.Label()
  20. label.set_markup(quote)
  21. vbox = gtk.VBox(False, 0)
  22. vbox.add(label)
  23. self.add(vbox)
  24. self.set_position(gtk.WIN_POS_CENTER)
  25. self.show_all()
  26. PyApp()
  27. gtk.main()

在代码示例中,我们有一个标签。 我们使用标记语言更改其文本属性。

  1. quote = "<span foreground='blue' size='19000'>The only victory over love is flight</span>"

这是带有标记语言的文本。

  1. label = gtk.Label()
  2. label.set_markup(quote)

我们创建标签小部件并为其设置标记文本。

Pango II - 图2

图:使用标记

Pango 布局

Pango 布局是一个对象,代表带有属性的文本段落。

layout.py

  1. #!/usr/bin/python
  2. # ZetCode PyGTK tutorial
  3. #
  4. # This example shows pango Layout
  5. # in action
  6. #
  7. # author: jan bodnar
  8. # website: zetcode.com
  9. # last edited: February 2009
  10. import gtk
  11. import pango
  12. lyrics = """Meet you downstairs in the bar and heard
  13. your rolled up sleeves and your skull t-shirt
  14. You say why did you do it with him today?
  15. and sniff me out like I was Tanqueray
  16. cause you're my fella, my guy
  17. hand me your stella and fly
  18. by the time I'm out the door
  19. you tear men down like Roger Moore
  20. I cheated myself
  21. like I knew I would
  22. I told ya, I was trouble
  23. you know that I'm no good"""
  24. class Area(gtk.DrawingArea):
  25. def __init__(self):
  26. super(Area, self).__init__()
  27. self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(16400, 16400, 16440))
  28. self.connect("expose_event", self.expose)
  29. def expose(self, widget, event):
  30. gc = self.get_style().fg_gc[gtk.STATE_NORMAL]
  31. font_desc = pango.FontDescription('Sans 10')
  32. layout = self.create_pango_layout(lyrics)
  33. width, height = self.get_size_request()
  34. attr = pango.AttrList()
  35. fg_color = pango.AttrForeground(60535, 60535, 60535, 0, -1)
  36. attr.insert(fg_color)
  37. layout.set_width(pango.SCALE * self.allocation.width)
  38. layout.set_spacing(pango.SCALE * 3)
  39. layout.set_alignment(pango.ALIGN_CENTER)
  40. layout.set_font_description(font_desc)
  41. layout.set_attributes(attr)
  42. self.window.draw_layout(gc, 0, 5, layout)
  43. class PyApp(gtk.Window):
  44. def __init__(self):
  45. super(PyApp, self).__init__()
  46. self.connect("destroy", gtk.main_quit)
  47. self.set_title("You know I'm no Good")
  48. self.add(Area())
  49. self.set_size_request(300, 300)
  50. self.set_position(gtk.WIN_POS_CENTER)
  51. self.show_all()
  52. PyApp()
  53. gtk.main()

在前面的示例中,我们正在修改现有小部件中的文本。 现在,我们将使用DrawingArea小部件上的 pango 布局绘制文本。 我们将使用Gdk绘图工具进行绘图。

  1. gc = self.get_style().fg_gc[gtk.STATE_NORMAL]

我们得到了绘图区域小部件的图形顶点。

  1. layout = self.create_pango_layout(lyrics)

在这里创建 pango 布局对象。

  1. layout.set_width(pango.SCALE * self.allocation.width)
  2. layout.set_spacing(pango.SCALE * 3)
  3. layout.set_alignment(pango.ALIGN_CENTER)
  4. layout.set_font_description(font_desc)
  5. layout.set_attributes(attr)

我们修改布局的宽度,间距,对齐方式,字体并设置文本属性。

  1. self.window.draw_layout(gc, 0, 5, layout)

布局正在窗口上绘制。

Pango II - 图3

图:布局

在 PyGTK 编程库的这一章中,我们进一步使用了 pango 库。