当前位置: 首页 > 文档资料 > PyGTK 教程 >

10 Pango

优质
小牛编辑
114浏览
2023-12-01

在教程的这个部分,我们将探索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库来工作。