[Python,Gtk4] Gtk.FontDialogの使用について

目標

 Gtk.FontDialogは、Gtkの4.10から追加されたフォントを選択するためのダイアログです。今回は、Gtk.FontDialogを使用したフォントの選択と選択したフォントの取得方法について紹介します。

Gtk.FontDialogの定義

 Gtk.FontDialogの定義は以下のようにおこないます。

        fontdialog = Gtk.FontDialog(
            title="フォントの選択",
            modal=True,
        )
内容
filterGtk.FilterGtk.FontDialogに表示するフォントを制限するフィルターを指定する
font-mapPango.FontMapフォントを選択するためのマップを指定する。
カスタムフォントマップを使用すると、通常のシステム フォントの代わりに、システムフォント及びアプリケーション固有のフォントを表示できる。
languagePango.Languageフォント機能が選択されている言語を指定する。
modalboolGtk.FontDialogがモーダルかどうかを指定する
titlestrGtk.FontDialogに表示するタイトルを指定する
`Gtk.FontDialogのプロパティ

※ font-map、filter、languageは、今回使用しません。

取得するフォント情報を選択する

 Gtk.FontDialogは、取得するフォント情報によって使用するメソッドを変更します。

取得する内容 使用するメソッド taskの型
Font Face(同じファミリー、スラント、ウェイト、幅を持つがサイズが異なるフォントのグループ)を取得する。
choose_face()
choose_face_finish(task)
Pango.FontFace
Font Family(関連するフォントフェイスのファミリーを表すもの)を取得する。chose_family()
chose_faimly_finish(task)
Pango.FontFamily
Font Description(実装に依存しない方法でフォントを記述したもの)を取得する。chose_font()
chose_font_finish(task)
Pango.FontDescription
Gtk.FontDialogのフォント情報を取得するためのメソッド

選択したフォント情報を取得する(chose_font()を使用する場合)

 Gtk.FontDialogで選択したフォントを取得する作業は、以下の手順でおこないます。
 1. メソッドchoose_font()によりファイルダイアログを表示する。
 2. 関数on_font_select(1.で指定)内で、メソッドchoose_font_finishにより
  選択したファイル(戻り値は、Pango.FontDescriptionもしくはNone)を取得する。
 3. 取得したPango.FontDescriptionよりフォント情報を取得する。

    fontdialog.choose_font(
        parent=self, cancellable=None,
        callback=self.on_font_select)

def on_font_select(self, fontdialog, task):
    try:
        font = fontdialog.choose_font_finish(task)
    except GLib.GError:
        return
    print(f'Family:  {font.get_family()}')
    print(f'Style:   {font.get_style()}')
    print(f'Stretch: {font.get_stretch()}')
    print(f'Variant: {font.get_variant()}')
    print(f'Sizde:   {font.get_size()/Pango.SCALE}')

フォントのサイズを算出する

 Pango.FontDescriptionのメソッドget_size()で取得する値は、Pango.SCALE によってスケーリングされたフォントのサイズ (ポイント単位)です。この値をポイントに変換するために、以下の青字のような計算をおこないます。

    print(f'Sizde:   {font.get_size()/Pango.SCALE}')

サンプルプログラム

 以下のプログラムを実行すると、左図のようなウィンドウが表示されます。ウィンドウ内の`Gtk.FontDialoの表示`ボタンを押すと、右図のようなGtk.FontDialogが表示されます。
 Gtk.FontDialogでフォントを選択してOkボタンを押すと、ターミナルに選択したフォント情報を表示します。

import gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk, Pango, GLib


APPID = 'com.github.taniyoshima.g4_fblog2_fontdialog'


class Gtk4TestTest(Gtk.Window):

    def __init__(self, app):
        Gtk.Window.__init__(
            self, application=app, title='FontDialog Test',
            default_width=400, default_height=80)

        button = Gtk.Button(
            label='Gtk.FontDialogの表示',
            margin_top=20, margin_bottom=20,
            margin_start=20, margin_end=20,
        )
        button.connect('clicked', self.on_button_clicked)

        self.set_child(button)

    def on_button_clicked(self, button):
        fontdialog = Gtk.FontDialog(
            title="フォントの選択",
            modal=True,
        )

        fontdialog.choose_font(
            parent=self, cancellable=None,
            callback=self.on_font_select)

    def on_font_select(self, fontdialog, task):
        try:
            font = fontdialog.choose_font_finish(task)
        except GLib.GError:
            return
        print(f'Family:  {font.get_family()}')
        print(f'Style:   {font.get_style()}')
        print(f'Stretch: {font.get_stretch()}')
        print(f'Variant: {font.get_variant()}')
        print(f'Sizde:   {font.get_size()/Pango.SCALE}')


class Gtk4TestApp(Gtk.Application):

    def __init__(self):
        Gtk.Application.__init__(self, application_id=APPID)

    def do_activate(self):
        window = Gtk4TestTest(self)
        window.present()


def main():
    app = Gtk4TestApp()
    app.run()


if __name__ == '__main__':
    main()
タイトルとURLをコピーしました