Как задать шрифт из файла ttf для label в gtk?

Учусь писать на gtk и наткнулся на такую непростую на мой взгляд задачу.

Требуется задать какой-то шрифт для label. Чего я уже добился:

...
lbl = Gtk.Label(label='Hello')
lbl.override_font(Pango.FontDescription('Arial 25'))
...

Работает! Но мне захотелось задать для лейбла шрифт из файла .ttf. Какие-то решения в сети уже находил, но везде предлагают сначала установить этот щрифт (сделать его системным), а уже потом его использовать. А мне именно этого делать не надо.

Как задать .ttf-шрифт для лейбла, не устанавливая этот шрифт в систему?


Ответы (1 шт):

Автор решения: Рустам Рысаев

В GTK+ (PyGObject) можно загрузить шрифт из файла .ttf с помощью Pango и fontconfig, не устанавливая его в систему. Нужно создать Pango.FontMap и загрузить шрифт вручную.

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Pango, PangoCairo, GObject
import cairo

# Функция загрузки шрифта из файла
def load_font_from_file(font_path):
    font_map = PangoCairo.FontMap.get_default()  
    context = font_map.create_context()  
    font_desc = Pango.FontDescription()

    font_desc.set_family("CustomFont")  
    font_desc.set_size(25 * Pango.SCALE)  


    import subprocess
    subprocess.run(["fc-cache", "-fv"], check=True)

    return font_desc

# Основное GTK окно
class MyWindow(Gtk.Window):
    def __init__(self):
        super().__init__(title="Custom Font Label")
        self.set_default_size(300, 200)

        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
        self.add(vbox)

        # Загрузка шрифта
        font_desc = load_font_from_file("path/to/your-font.ttf")


        lbl = Gtk.Label(label="Привет")
        lbl.modify_font(font_desc)
        vbox.pack_start(lbl, True, True, 0)

        self.connect("destroy", Gtk.main_quit)

# Запуск GTK
win = MyWindow()
win.show_all()
Gtk.main()
→ Ссылка