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

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

Pango 是一个免费的开源计算库,可高质量呈现国际化文本。 可以使用不同的字体后端,从而允许跨平台支持。 (维基百科)

Pango 提供了用于GdkGtk的高级字体和文本处理。

简单的例子

在第一个示例中,我们展示了如何更改标签小部件的字体。

quotes.py

  1. #!/usr/bin/python
  2. # ZetCode PyGTK tutorial
  3. #
  4. # This example shows how to modify
  5. # the font of a label
  6. #
  7. # author: jan bodnar
  8. # website: zetcode.com
  9. # last edited: February 2009
  10. import gtk
  11. import pango
  12. quotes = """Excess of joy is harder to bear than any amount of sorrow.
  13. The more one judges, the less one loves.
  14. There is no such thing as a great talent without great will power.
  15. """
  16. class PyApp(gtk.Window):
  17. def __init__(self):
  18. super(PyApp, self).__init__()
  19. self.connect("destroy", gtk.main_quit)
  20. self.set_title("Quotes")
  21. label = gtk.Label(quotes)
  22. gtk.gdk.beep()
  23. fontdesc = pango.FontDescription("Purisa 10")
  24. label.modify_font(fontdesc)
  25. fix = gtk.Fixed()
  26. fix.put(label, 5, 5)
  27. self.add(fix)
  28. self.set_position(gtk.WIN_POS_CENTER)
  29. self.show_all()
  30. PyApp()
  31. gtk.main()

在上面的代码示例中,我们有一个带有三个引号的标签小部件。 我们将其字体更改为 Purisa 10。

  1. quotes = """Excess of joy is harder to bear than any amount of sorrow.
  2. The more one judges, the less one loves.
  3. There is no such thing as a great talent without great will power.
  4. """

这是要在标签中显示的文本。

  1. fontdesc = pango.FontDescription("Purisa 10")

FontDescription用于指定字体的特征。

  1. label.modify_font(fontdesc)

我们将标签小部件的字体更改为 Purisa 10。

Pango - 图1

图:Quotations

系统字体

下一个代码示例显示TreeView小部件中的所有可用字体。

systemfonts.py

  1. #!/usr/bin/python
  2. # ZetCode PyGTK tutorial
  3. #
  4. # This example lists all available
  5. # fonts on a system in a TreeView widget
  6. #
  7. # author: jan bodnar
  8. # website: zetcode.com
  9. # last edited: February 2009
  10. import gtk
  11. import pango
  12. class PyApp(gtk.Window):
  13. def __init__(self):
  14. super(PyApp, self).__init__()
  15. self.set_size_request(350, 250)
  16. self.set_border_width(8)
  17. self.connect("destroy", gtk.main_quit)
  18. self.set_title("System fonts")
  19. sw = gtk.ScrolledWindow()
  20. sw.set_shadow_type(gtk.SHADOW_ETCHED_IN)
  21. sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
  22. context = self.create_pango_context()
  23. self.fam = context.list_families()
  24. store = self.create_model()
  25. treeView = gtk.TreeView(store)
  26. treeView.set_rules_hint(True)
  27. sw.add(treeView)
  28. self.create_column(treeView)
  29. self.add(sw)
  30. self.set_position(gtk.WIN_POS_CENTER)
  31. self.show_all()
  32. def create_column(self, treeView):
  33. rendererText = gtk.CellRendererText()
  34. column = gtk.TreeViewColumn("FontName", rendererText, text=0)
  35. column.set_sort_column_id(0)
  36. treeView.append_column(column)
  37. def create_model(self):
  38. store = gtk.ListStore(str)
  39. for ff in self.fam:
  40. store.append([ff.get_name()])
  41. return store
  42. PyApp()
  43. gtk.main()

该代码示例显示了系统上所有可用的字体。

  1. context = self.create_pango_context()

此代码行创建一个 pango 上下文对象。 它包含有关文本渲染过程的全局信息。

  1. self.fam = context.list_families()

从上下文对象中,我们检索所有可用的字体系列。

  1. for ff in self.fam:
  2. store.append([ff.get_name()])

TreeView小部件的模型创建期间,我们从字体家族数组中获取所有字体名称,并将它们放入列表存储中。

Pango - 图2

图:系统字体

Unicode

Pango 用于处理国际化文本。

unicode.py

  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. # ZetCode PyGTK tutorial
  4. #
  5. # This example displays text
  6. # in azbuka
  7. #
  8. # author: jan bodnar
  9. # website: zetcode.com
  10. # last edited: February 2009
  11. import gtk
  12. import pango
  13. obj = unicode(u'''Фёдор Михайлович Достоевский родился 30 октября (11 ноября)
  14. 1821 года в Москве. Был вторым из 7 детей. Отец, Михаил Андреевич,
  15. работал вгоспитале для бедных. Мать, Мария Фёдоровна
  16. (в девичестве Нечаева), происходила из купеческого рода.''')
  17. class PyApp(gtk.Window):
  18. def __init__(self):
  19. super(PyApp, self).__init__()
  20. self.connect("destroy", gtk.main_quit)
  21. self.set_title("Unicode")
  22. label = gtk.Label(obj.encode('utf-8'))
  23. fontdesc = pango.FontDescription("Purisa 10")
  24. label.modify_font(fontdesc)
  25. fix = gtk.Fixed()
  26. fix.put(label, 5, 5)
  27. self.add(fix)
  28. self.set_position(gtk.WIN_POS_CENTER)
  29. self.show_all()
  30. PyApp()
  31. gtk.main()

我们在西里尔字母中显示一些文本。

  1. # -*- coding: utf-8 -*-

为了直接在源代码中使用国际化文本,我们必须提供此魔术注释。 请注意,它必须在第一行或第二行上。

  1. obj = unicode(u'''Фёдор Михайлович Достоевский родился 30 октября (11 ноября)
  2. 1821 года в Москве. Был вторым из 7 детей. Отец, Михаил Андреевич,
  3. работал вгоспитале для бедных. Мать, Мария Фёдоровна
  4. (в девичестве Нечаева), происходила из купеческого рода.''')

这是阿兹布卡语中的文字。

  1. Label label = new Label(text);

我们将编码的文本放入标签中。

Pango - 图3

图:Unicode

属性

Pango 属性是适用于一段文字的属性。

attributes.py

  1. #!/usr/bin/python
  2. # ZetCode PyGTK tutorial
  3. #
  4. # In this program we work with
  5. # pango attributes
  6. #
  7. # author: jan bodnar
  8. # website: zetcode.com
  9. # last edited: February 2009
  10. import gtk
  11. import pango
  12. text = "Valour fate kinship darkness"
  13. class PyApp(gtk.Window):
  14. def __init__(self):
  15. super(PyApp, self).__init__()
  16. self.connect("destroy", gtk.main_quit)
  17. self.set_title("Attributes")
  18. label = gtk.Label(text)
  19. attr = pango.AttrList()
  20. fg_color = pango.AttrForeground(65535, 0, 0, 0, 6)
  21. underline = pango.AttrUnderline(pango.UNDERLINE_DOUBLE, 7, 11)
  22. bg_color = pango.AttrBackground(40000, 40000, 40000, 12, 19)
  23. strike = pango.AttrStrikethrough(True, 20, 29)
  24. size = pango.AttrSize(30000, 0, -1)
  25. attr.insert(fg_color)
  26. attr.insert(underline)
  27. attr.insert(bg_color)
  28. attr.insert(size)
  29. attr.insert(strike)
  30. label.set_attributes(attr)
  31. fix = gtk.Fixed()
  32. fix.put(label, 5, 5)
  33. self.add(fix)
  34. self.set_position(gtk.WIN_POS_CENTER)
  35. self.show_all()
  36. PyApp()
  37. gtk.main()

在代码示例中,我们显示了应用于文本的四个不同属性。

  1. attr = pango.AttrList()

Pango 属性列表是用于保存属性的对象。

  1. fg_color = pango.AttrForeground(65535, 0, 0, 0, 6)

在这里,我们创建一个属性,该属性将以红色呈现文本。 前三个参数是颜色的 R,G,B 值。 最后两个参数是文本的开始和结束索引,我们将其应用于此属性。

  1. label.set_attributes(attr)

我们设置标签的属性列表。

Pango - 图4

图:Pango 属性

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