PyGTK FAQ Pango

Материал из Wiki.crossplatform.ru

(Различия между версиями)
Перейти к: навигация, поиск
(Новая: In this part of the PyGTK programming tutorial, we will explore the Pango library. Pango is a free and open source computing library for rendering internationalized texts in high quali...)
(Удалено по требованию автора...)
 
(1 промежуточная версия не показана)
Строка 1: Строка 1:
-
In this part of the PyGTK programming tutorial, we will explore the Pango library.
 
-
 
-
Pango is a free and open source computing library for rendering internationalized texts in high quality. Different font backends can be used, allowing cross-platform support.
 
-
(wikipedia) Pango provides advanced font and text handling that is used for <b>Gdk</b> and <b>Gtk</b>.
 
-
 
-
== Simple example ==
 
-
In our first example, we show, how to change font for our label widget. 
 
-
<source lang="python">
 
-
#!/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()
 
-
</source>
 
-
 
-
In the above code example, we have a label widget with three quotations. We change it's font to Purisa 10.
 
-
 
-
<source lang="python">
 
-
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.
 
-
"""
 
-
</source>
 
-
 
-
This is the text to show in the label.
 
-
 
-
<source lang="python">
 
-
fontdesc = pango.FontDescription("Purisa 10")
 
-
</source>
 
-
 
-
The <b>FontDescription</b> is used to specify the characteristics of a font.
 
-
 
-
<source lang="python">
 
-
label.modify_font(fontdesc)
 
-
</source>
 
-
 
-
We change the font of the label widget to Purisa 10.
 
-
 
-
 
-
[[image: pygtk_faq_quotations.png | center]]
 
-
 
-
== System fonts ==
 
-
The next code example shows all available fonts in a <b>TreeView</b> widget.
 
-
<source lang="python">
 
-
#!/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()
 
-
</source>
 
-
 
-
The code example shows all available fonts on a system.
 
-
 
-
<source lang="python">
 
-
context = self.create_pango_context()
 
-
</source>
 
-
 
-
This code line creates a pango context object.  It contains global information about the rendering process of text.
 
-
 
-
<source lang="python">
 
-
 
-
self.fam = context.list_families()
 
-
</source>
 
-
 
-
From the context object, we retrieve all available font families.
 
-
 
-
<source lang="python">
 
-
for ff in self.fam:
 
-
    store.append([ff.get_name()])
 
-
</source>
 
-
 
-
During the model creation of the <b>TreeView</b> widget, we get all font names from the array of font families and put them into the list store.
 
-
 
-
[[image: pygtk_faq_systemfonts.png | center]]
 
-
 
-
== Unicode ==
 
-
Pango is used to work with internationalized text.
 
-
<source lang="python">
 
-
#!/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()
 
-
</source>
 
-
 
-
We show some text in azbuka.
 
-
 
-
<source lang="python">
 
-
# -*- coding: utf-8 -*-
 
-
</source>
 
-
 
-
In order to work directly with internationalized text in the source code, we must provide this magic comment. Note, that it must be on the first or the second line.
 
-
 
-
<source lang="python">
 
-
obj = unicode(u'''Фёдор Михайлович Достоевский родился 30 октября (11 ноября)
 
-
1821 года в Москве. Был вторым из 7 детей. Отец, Михаил Андреевич,
 
-
работал вгоспитале для бедных. Мать, Мария Фёдоровна
 
-
(в девичестве Нечаева), происходила из купеческого рода.''')
 
-
</source>
 
-
 
-
This is text in azbuka.
 
-
 
-
<source lang="python">
 
-
Label label = new Label(text);
 
-
</source>
 
-
 
-
We put encoded text into the label. 
 
-
 
-
[[image: pygtk_faq_unicode.png | center]]
 
-
 
-
 
-
== Attributes ==
 
-
Pango attribute is an attribute that applies to a section of text.
 
-
<source lang="python">
 
-
#!/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()
 
-
</source>
 
-
 
-
In the code example we show four different attributes applied
 
-
on the text.
 
-
 
-
<source lang="python">
 
-
attr = pango.AttrList()
 
-
</source>
 
-
 
-
Pango attribute list is an object for holding attributes.
 
-
 
-
<source lang="python">
 
-
fg_color = pango.AttrForeground(65535, 0, 0, 0, 6)
 
-
</source>
 
-
 
-
Here we create an attribute that will render text in red color.  The first three parameters are the R, G, B values of a color. The last two parameters are the start and end indexes of the text, to which we apply this attribute.
 
-
 
-
<source lang="python">
 
-
label.set_attributes(attr)
 
-
</source>
 
-
 
-
We set the list of attributes for the label.
 
-
 
-
[[image: pygtk_faq_attributes.png | center]]
 
-
 
-
In this chapter of the PyGTK programming library, we worked with pango library.
 
-
 
-
== Animated text ==
 
-
The following example shows animated text on window. 
 
-
<source lang="python">
 
-
#!/usr/bin/python
 
-
# ZetCode PyGTK tutorial
 
-
#
 
-
# This example shows animated text
 
-
#
 
-
# author: jan bodnar
 
-
# website: zetcode.com
 
-
# last edited: February 2009
 
-
 
-
import gtk
 
-
import glib
 
-
import pango
 
-
import math
 
-
 
-
 
-
class PyApp(gtk.Window):
 
-
    def __init__(self):
 
-
        super(PyApp, self).__init__()
 
-
       
 
-
        self.connect("destroy", gtk.main_quit)
 
-
        glib.timeout_add(160, self.on_timer)
 
-
       
 
-
        self.count = 1
 
-
       
 
-
        self.set_border_width(10)
 
-
        self.set_title("ZetCode")
 
-
       
 
-
        self.label = gtk.Label("ZetCode")
 
-
     
 
-
        fontdesc = pango.FontDescription("Serif Bold 30")
 
-
        self.label.modify_font(fontdesc)
 
-
 
-
        vbox = gtk.VBox(False, 0)
 
-
        vbox.add(self.label)
 
-
       
 
-
        self.add(vbox)
 
-
        self.set_size_request(300, 250)
 
-
        self.set_position(gtk.WIN_POS_CENTER)
 
-
        self.show_all()
 
-
       
 
-
    def on_timer(self):
 
-
        attr = pango.AttrList()
 
-
        self.count = self.count + 1
 
-
               
 
-
        for i in range(7):
 
-
            r = pango.AttrRise(int(math.sin(self.count+i)*20)*pango.SCALE, i, i+1)
 
-
            attr.insert(r)
 
-
                       
 
-
        self.label.set_attributes(attr)
 
-
        return True
 
-
       
 
-
       
 
-
PyApp()
 
-
gtk.main()
 
-
</source>
 
-
 
-
In the above code example, we have a text in a label widget. By continuously changing its pango attributes, the text is being animated.
 
-
 
-
<source lang="python">
 
-
self.label = gtk.Label("ZetCode")
 
-
     
 
-
fontdesc = pango.FontDescription("Serif Bold 30")
 
-
self.label.modify_font(fontdesc)
 
-
</source>
 
-
 
-
We create a label widget and modify its font. We choose a bit larger text for better visibility.
 
-
 
-
<source lang="python">
 
-
vbox = gtk.VBox(False, 0)
 
-
vbox.add(self.label)
 
-
</source>
 
-
 
-
We put the label into the vertical box. This centers  the label on the window.
 
-
 
-
The animation is performed inside the <b>on_timer()</b> method.
 
-
 
-
<source lang="python">
 
-
for i in range(7):
 
-
    r = pango.AttrRise(int(math.sin(self.count+i)*20)*pango.SCALE, i, i+1)
 
-
    attr.insert(r)
 
-
</source>
 
-
 
-
We have seven characters in our text. We periodically change the pango <b>AttrRise</b> attribute for each character. The rise is based on the trigonometric sine function. The text movement follows the sine function graphed on the cartesian graph.
 
-
 
-
Also notice the <b>pango.SCALE</b> constant. The pango library has its own units. They differ from what is used by the widgets to draw graphics or text. We must multiply our numbers by this constant.
 
-
 
-
[[image: pygtk_faq_sine.png | center]]
 
-
 
-
== Using markup language ==
 
-
We can change the attributes of the text using the built-in markup language.
 
-
<source lang="python">
 
-
#!/usr/bin/python
 
-
# ZetCode PyGTK tutorial
 
-
#
 
-
# This example uses markup language
 
-
# to change attributes of the text
 
-
#
 
-
# author: jan bodnar
 
-
# website: zetcode.com
 
-
# last edited: February 2009
 
-
 
-
import gtk
 
-
import pango
 
-
 
-
quote = "&lt;span foreground='blue' size='19000'&gt;The only victory over love is flight&lt;/span&gt;"
 
-
 
-
 
-
class PyApp(gtk.Window):
 
-
    def __init__(self):
 
-
        super(PyApp, self).__init__()
 
-
       
 
-
        self.set_title("Markup")
 
-
        self.set_border_width(5)
 
-
        self.connect("destroy", gtk.main_quit)
 
-
       
 
-
        label = gtk.Label()
 
-
        label.set_markup(quote)
 
-
 
-
        vbox = gtk.VBox(False, 0)
 
-
        vbox.add(label)
 
-
 
 
-
        self.add(vbox)
 
-
        self.set_position(gtk.WIN_POS_CENTER)
 
-
        self.show_all()
 
-
 
-
PyApp()
 
-
gtk.main()
 
-
</source>
 
-
 
-
In the code example, we have a label. We change the it's text attributes with the markup language.
 
-
 
-
<source lang="python">
 
-
quote = "&lt;span foreground='blue' size='19000'&gt;The only victory over love is flight&lt;/span&gt;"
 
-
 
-
</source>
 
-
 
-
This is the text with the markup language.
 
-
 
-
<source lang="python">
 
-
label = gtk.Label()
 
-
label.set_markup(quote)
 
-
</source>
 
-
 
-
We create a label widget and set a markup text for it.
 
-
 
-
[[image: pygtk_faq_markup.png | center]]
 
-
 
-
== Pango layout ==
 
-
Pango layout is an object representing a paragraph of text with attributes.
 
-
<source lang="python">
 
-
#!/usr/bin/python
 
-
# ZetCode PyGTK tutorial
 
-
#
 
-
# This example shows pango Layout
 
-
# in action
 
-
#
 
-
# author: jan bodnar
 
-
# website: zetcode.com
 
-
# last edited: February 2009
 
-
 
-
import gtk
 
-
import pango
 
-
 
-
lyrics = """Meet you downstairs in the bar and heard
 
-
your rolled up sleeves and your skull t-shirt
 
-
You say why did you do it with him today?
 
-
and sniff me out like I was Tanqueray
 
-
 
-
cause you're my fella, my guy
 
-
hand me your stella and fly
 
-
by the time I'm out the door
 
-
you tear men down like Roger Moore
 
-
 
-
I cheated myself
 
-
like I knew I would
 
-
I told ya, I was trouble
 
-
you know that I'm no good"""
 
-
 
-
class Area(gtk.DrawingArea):
 
-
    def __init__(self):
 
-
        super(Area, self).__init__()
 
-
        self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(16400, 16400, 16440))
 
-
        self.connect("expose_event", self.expose)
 
-
 
-
    def expose(self, widget, event):
 
-
       
 
-
        gc = self.get_style().fg_gc[gtk.STATE_NORMAL]
 
-
        font_desc = pango.FontDescription('Sans 10')
 
-
       
 
-
        layout = self.create_pango_layout(lyrics)
 
-
        width, height = self.get_size_request()
 
-
       
 
-
        attr = pango.AttrList()
 
-
       
 
-
        fg_color = pango.AttrForeground(60535, 60535, 60535, 0, -1)
 
-
        attr.insert(fg_color)
 
-
       
 
-
        layout.set_width(pango.SCALE * self.allocation.width)
 
-
        layout.set_spacing(pango.SCALE * 3)
 
-
        layout.set_alignment(pango.ALIGN_CENTER)
 
-
        layout.set_font_description(font_desc)
 
-
        layout.set_attributes(attr)
 
-
       
 
-
        self.window.draw_layout(gc, 0, 5, layout)
 
-
       
 
-
       
 
-
 
-
class PyApp(gtk.Window):
 
-
    def __init__(self):
 
-
        super(PyApp, self).__init__()
 
-
       
 
-
        self.connect("destroy", gtk.main_quit)
 
-
        self.set_title("You know I'm no Good")
 
-
       
 
-
        self.add(Area())
 
-
        self.set_size_request(300, 300)
 
-
        self.set_position(gtk.WIN_POS_CENTER)
 
-
        self.show_all()
 
-
 
-
 
-
PyApp()
 
-
gtk.main()
 
-
</source>
 
-
 
-
In the previous examples, we were modifying text in existing  widgets. Now we are going to draw the text using the pango  layout on the <b>DrawingArea</b> widget.  We will be drawing using the <b>Gdk</b> drawing tools.
 
-
 
-
<source lang="python">
 
-
gc = self.get_style().fg_gc[gtk.STATE_NORMAL]
 
-
</source>
 
-
 
-
We get the graphics contex of the drawing area widget.
 
-
 
-
<source lang="python">
 
-
layout = self.create_pango_layout(lyrics)
 
-
</source>
 
-
 
-
Here create the pango layout object.
 
-
 
-
<source lang="python">
 
-
layout.set_width(pango.SCALE * self.allocation.width)
 
-
layout.set_spacing(pango.SCALE * 3)
 
-
layout.set_alignment(pango.ALIGN_CENTER)
 
-
layout.set_font_description(font_desc)
 
-
layout.set_attributes(attr)
 
-
</source>
 
-
 
-
We modify layout's width, spacing, alignment, font and set text attributes.
 
-
 
-
<source lang="python">
 
-
self.window.draw_layout(gc, 0, 5, layout)
 
-
</source>
 
-
 
-
The layout is being drawn on the window.
 
-
 
-
[[image: pygtk_faq_layout.png | center]]
 
-
 
-
 
-
In this chapter of the PyGTK programming library, we further worked with pango library.
 
-
 
-
[[Категория:Python]]
 
-
[[Категория:GTK]]
 

Текущая версия на 11:25, 7 апреля 2009