10 Pango
在教程的这个部分,我们将探索Pango库。
Pango是一个免费的开源的计算处理库,它用来在较高的层次处理国际化的文本。使用不同类型的字体后端,并且提供跨平台的支持。(来自Wikipedia)
Pango提供了高级的字体和文本处理函数,它被用来为GDK和GTK服务。
Simple Example
在我们的第一个例子中,我们将展示怎样去改变我们标签部件的字体。
Code:quotes.py
#!/usr/bin/python
# ZetCode PyGTK tutorial
#
# This example shows how to modify
# the font of a label
#
# author: jan bodnar
# website: zetcode.com
# last edited: February 2009
import gtk
import pango
quotes = """Excess of joy is harder to bear than any amount of sorrow.
The more one judges, the less one loves.
There is no such thing as a great talent without great will power.
"""
class PyApp(gtk.Window):
def __init__(self):
super(PyApp, self).__init__()
self.connect("destroy", gtk.main_quit)
self.set_title("Quotes")
label = gtk.Label(quotes)
gtk.gdk.beep()
fontdesc = pango.FontDescription("Purisa 10")
label.modify_font(fontdesc)
fix = gtk.Fixed()
fix.put(label, 5, 5)
self.add(fix)
self.set_position(gtk.WIN_POS_CENTER)
self.show_all()
PyApp()
gtk.main()
在我们上面的代码示例中,我们有一个包含三个引用的标签部件。我们改变它的字体为Purisa 10。
quotes = """Excess of joy is harder to bear than any amount of sorrow. The more one judges, the less one loves. There is no such thing as a great talent without great will power. """
这是将会展示在标签中的文本。
fontdesc = pango.FontDescription("Purisa 10")
FontDescription 方法被用来指定字体的特征。
label.modify_font(fontdesc)
我们改变标签部件的字体为 Purisa 10。
Figure:Quotations
System Fonts
下面的代码例子将在一个TreeView部件中展示所有可用的字体。
Code:systemfonts.py #!/usr/bin/python # ZetCode PyGTK tutorial # # This example lists all available # fonts on a system in a TreeView widget # # author: jan bodnar # website: zetcode.com # last edited: February 2009 import gtk import pango class PyApp(gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_size_request(350, 250) self.set_border_width(8) self.connect("destroy", gtk.main_quit) self.set_title("System fonts") sw = gtk.ScrolledWindow() sw.set_shadow_type(gtk.SHADOW_ETCHED_IN) sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) context = self.create_pango_context() self.fam = context.list_families() store = self.create_model() treeView = gtk.TreeView(store) treeView.set_rules_hint(True) sw.add(treeView) self.create_column(treeView) self.add(sw) self.set_position(gtk.WIN_POS_CENTER) self.show_all() def create_column(self, treeView): rendererText = gtk.CellRendererText() column = gtk.TreeViewColumn("FontName", rendererText, text=0) column.set_sort_column_id(0) treeView.append_column(column) def create_model(self): store = gtk.ListStore(str) for ff in self.fam: store.append([ff.get_name()]) return store PyApp() gtk.main()
在代码示例中展示了系统中所有可用的字体。
context = self.create_pango_context()
这行代码创建了一个Pango的Context对象。它包含了对文本进行修饰过程的全局信息。
self.fam = context.list_families()
从这个Context对象,我们获取了所有可用的字体家族。
for ff in self.fam: store.append([ff.get_name()])
在TreeView部件模型创建的过程中,我们从字体家族的数组中获取所有的字体名称,并且将它们放到ListStore中。
Figure:SystemFonts
Unicode
Pango被用作处理国际化的文本。
Code:unicode.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
# ZetCode PyGTK tutorial
#
# This example displays text
# in azbuka
#
# author: jan bodnar
# website: zetcode.com
# last edited: February 2009
import gtk
import pango
obj = unicode(u'''Фёдор Михайлович Достоевский родился 30 октября (11 ноября)
1821 года в Москве. Был вторым из 7 детей. Отец, Михаил Андреевич,
работал вгоспитале для бедных. Мать, Мария Фёдоровна
(в девичестве Нечаева), происходила из купеческого рода.''')
class PyApp(gtk.Window):
def __init__(self):
super(PyApp, self).__init__()
self.connect("destroy", gtk.main_quit)
self.set_title("Unicode")
label = gtk.Label(obj.encode('utf-8'))
fontdesc = pango.FontDescription("Purisa 10")
label.modify_font(fontdesc)
fix = gtk.Fixed()
fix.put(label, 5, 5)
self.add(fix)
self.set_position(gtk.WIN_POS_CENTER)
self.show_all()
PyApp()
gtk.main()
我们用azbuka语言展示了一些文本。【译者注:azbuka不知道什么意思,有可能拼写错误,此处应该代表一种语言文字的名称】
# -*- coding: utf-8 -*-
为了在源代码中能够直接用国际化的文本进行工作,我们必须提供这个神奇的注释。注意了,它必须被放置在第一或者第二行。
obj = unicode(u'''Фёдор Михайлович Достоевский родился 30 октября (11 ноября) 1821 года в Москве. Был вторым из 7 детей. Отец, Михаил Андреевич, работал вгоспитале для бедных. Мать, Мария Фёдоровна (в девичестве Нечаева), происходила из купеческого рода.''')
这是用azbuka语言拼写的文本。
Label label = new Label(text);
我们将编码过的文本放进标签中。
Figure:Unicode
Attributes
Pango属性就是一种应用于部分文本的属性特征。
Code:attributes.py
#!/usr/bin/python
# ZetCode PyGTK tutorial
#
# In this program we work with
# pango attributes
#
# author: jan bodnar
# website: zetcode.com
# last edited: February 2009
import gtk
import pango
text = "Valour fate kinship darkness"
class PyApp(gtk.Window):
def __init__(self):
super(PyApp, self).__init__()
self.connect("destroy", gtk.main_quit)
self.set_title("Attributes")
label = gtk.Label(text)
attr = pango.AttrList()
fg_color = pango.AttrForeground(65535, 0, 0, 0, 6)
underline = pango.AttrUnderline(pango.UNDERLINE_DOUBLE, 7, 11)
bg_color = pango.AttrBackground(40000, 40000, 40000, 12, 19)
strike = pango.AttrStrikethrough(True, 20, 29)
size = pango.AttrSize(30000, 0, -1)
attr.insert(fg_color)
attr.insert(underline)
attr.insert(bg_color)
attr.insert(size)
attr.insert(strike)
label.set_attributes(attr)
fix = gtk.Fixed()
fix.put(label, 5, 5)
self.add(fix)
self.set_position(gtk.WIN_POS_CENTER)
self.show_all()
PyApp()
gtk.main()
在上面的代码示例中,我们展示了应用于文本的四种不同的属性特征。
attr = pango.AttrList()
Pango的属性列表就是一个保存属性的对象。
fg_color = pango.AttrForeground(65535, 0, 0, 0, 6)
这里我们创建了一种属性,它用来将文本的颜色修饰为红色。前面的三个参数是一种颜色的R、G、B值。后面两个参数是我们要应用这个属性的文本的开头和结尾索引值。
label.set_attributes(attr)
我们为标签设置这个属性列表。
Figure:Pango attributes
在教程的这章中,我们用Pango库来工作。