目標
Gtk.FontDialogは、Gtkの4.10から追加されたフォントを選択するためのダイアログです。今回は、Gtk.FontDialogを使用したフォントの選択と選択したフォントの取得方法について紹介します。
Gtk.FontDialogの定義
Gtk.FontDialogの定義は以下のようにおこないます。
fontdialog = Gtk.FontDialog(
title="フォントの選択",
modal=True,
)
値 | 型 | 内容 |
---|---|---|
filter | Gtk.Filter | Gtk.FontDialogに表示するフォントを制限するフィルターを指定する |
font-map | Pango.FontMap | フォントを選択するためのマップを指定する。 カスタムフォントマップを使用すると、通常のシステム フォントの代わりに、システムフォント及びアプリケーション固有のフォントを表示できる。 |
language | Pango.Language | フォント機能が選択されている言語を指定する。 |
modal | bool | Gtk.FontDialogがモーダルかどうかを指定する |
title | str | 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 |
選択したフォント情報を取得する(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()