На официальном сайте Gnome Developer в разделе Drawing Area Widget мы нашли важное замечание: "Pango - это лучший выбор, если вы хотите сделать изысканную отрисовку текста, такую как, например, обертывание".

Будем работать с Gtk+ объектом класса GtkDrawingArea и с библиотекой Pango и PangoCairo. Выведем красивый текст.

Запустите IDE Glade, создайте новый проект.

Создайте Окно класса GtkWindow, на вкладке Основные свойства присвойте ему идентификатор ID: window. Там же, на вкладке Основные свойства присвойте окну Заголовок PangoCairo и проставьте размер и галочки Ширина по умолчанию 300 и Высота по умолчанию 300. На вкладке Сигналы в разделе GtkWidget событию destroy задайте обработчик on_destroy.

Поверх окна window разместите Display GtkDrawingArea. На вкладке Основные свойства задайте ему имя colorDraw. 

 

В IDE Glade сохраните проект под именем, например, examle. В результате вы получите файл example.glade:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
  <requires lib="gtk+" version="3.20"/>
  <object class="GtkWindow" id="window">
    <property name="can_focus">False</property>
    <property name="hexpand">True</property>
    <property name="vexpand">True</property>
    <property name="title" translatable="yes">PangoCairo</property>
    <property name="default_width">300</property>
    <property name="default_height">300</property>
    <signal name="destroy" handler="on_destroy" swapped="no"/>
    <child>
      <placeholder/>
    </child>
    <child>
      <object class="GtkDrawingArea" id="colorDraw">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
      </object>
    </child>
  </object>
</interface>

В текстовом редакторе или, например, в IDE IDLE напишите программу example.py следующего содержания:

#!/usr/bin/python3
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: t; c-basic-offset: 4; tab-width:$

import gi
gi.require_version('Gtk', '3.0')
gi.require_version('PangoCairo', '1.0')
from gi.repository import Gtk, Pango, PangoCairo
import math

XML_FILE = "example.glade"
RADIUS = 148
N_WORDS = 7
FONT = "Sans Bold 26"

def do_draw(self, cr):
    cr.translate ( RADIUS, RADIUS)
    layout = PangoCairo.create_layout (cr)
    layout.set_text("Женя", -1)
    desc = Pango.font_description_from_string (FONT)
    layout.set_font_description( desc)
    for i in range(0, N_WORDS):
        width, height = 0,0
        angle = (360. * i) / N_WORDS;
        cr.save ()
        red   = (1 + math.cos ((angle - 60) * math.pi / 180.)) / 2
        cr.set_source_rgb ( red, 0, 1.0 - red)
        cr.rotate ( angle * math.pi / 180.)
        PangoCairo.update_layout (cr, layout)
        width, height = layout.get_size()
        cr.move_to ( - (float(width) / 1024.) / 2, - RADIUS)
        PangoCairo.show_layout (cr, layout)
        cr.restore()

class Handler:
    def on_destroy(self, *args):
        print("Программа завершена")
        Gtk.main_quit()

builder = Gtk.Builder()
builder.add_from_file(XML_FILE)
builder.connect_signals(Handler())
win = builder.get_object("window")
colordr = builder.get_object("colorDraw")
colordr.connect('draw', do_draw)
win.show_all()
Gtk.main()

Наш проект состоит их 2-х файлов example.py иexample.glade. Теперь можно запускать нашу программу через терминал в папке проекта или через IDE IDLE:

dior@U18pro:~/Python/Example/Gtk Drawin Area PangoCairo$ ./example.py

Работает: