質問: GTKでテキストウィジェットのテキストのスタイルを変えられますか? 1. 色 2. フォント 3. 書体 リファレンスなどで探したのですが最新のバージョンで使えるものがありません。
回答: 概要 まずは、Text Widget Overview で概要をつかむのがよさそうです。 スタイルの変更に関係が深そうな前半は、ざっと次のような内容です。 ### バッファとビュー `GtkTextBuffer` は編集中のテキストを表現する(バッファ)。 ウィジェット `GtkTextView` は `GtkTextBuffer` を表示する(ビュー)。 バッファは任意の数のビューで表示出来る。 ### エンコーディング、文字のカウント GTK+ におけるテキストのエンコーディングは UTF-8。 つまり、1文字が2バイト以上になり得る。 何文字目か、のカウントはオフセット(offsets)と呼ばれる。 何バイト目か、のカウントはインデックス(indexes)と呼ばれる。 ### タグ バッファ内のテキストはタグ(tag)でマーク(mark)する事が出来る。 タグとはテキストのある範囲に付与する属性。 例えば、あるタグを "bold" と名付け、そのタグ内のテキストを太字にする、といった事が出来る。 ただし、タグはテキストの外観に影響を与えるためだけにあるのではない。 マウスやキーボードでの操作への影響、テキストの一定範囲を編集不可にする、など様々な用途に使用される。 タグは `GtkTextTag` オブジェクトで表現される。 一つの `GtkTextTag` を、任意の数のバッファ内の任意の数のテキスト範囲に付与出来る。 各タグは `GtkTextTagTable` (タグテーブル)に格納される。 タグテーブルは一緒に使用できるタグの集合を定義する。 各バッファには、一つのタグテーブルが関連付けられ、そのタグテーブルのタグのみがそのバッファで使用出来る。 ただし、タグテーブルは複数のバッファ間で共有出来る。 タグには名前を付けてもよい。 これは例えば、"bold" と名付けたタグでテキストを太字にする、などの利便性のため。 名前を付けない、匿名のタグもある。 これは、その場(on-the-fly)でタグを作るのに便利。 ### 操作 ほとんどのテキスト操作は `GtkTextIter` で表現されるイテレータを使用して成される。 イテレータはテキストバッファ内の2文字間の位置を表現する。 その他、マークなどの説明が続きます。 公式のリファレンス、デモ Gtk3 のリファレンスは developer.gnome.org にあります。 また、`gtk3-demo` というデモアプリケーションがあり、 これは Ubuntu であれば、`gtk-3-examples` というパッケージに含まれていますが、以下のようにソースコードも閲覧出来るようになっています。 !gtk3-demo screen shot 簡単な例 Python ですが、一応タグを使う例です。 ``` #!/usr/bin/python3 import gi gi.require_version('GLib', '2.0') gi.require_version('Gtk', '3.0') from gi.repository import GLib from gi.repository import Gtk # イベントループ loop = GLib.MainLoop() # メインウィンドウ win = Gtk.Window.new(Gtk.WindowType.TOPLEVEL) win.set_title("TextView のテスト") win.connect("delete-event", lambda *x: loop.quit()) # バッファ buf = Gtk.TextBuffer.new(None) buf.set_text("今日は、世界!\n") # 文字を大きくするタグ big_tag = buf.create_tag( "big", background="#fff", foreground="#000", family="Serif", scale=2) # バッファの0~2文字目(オフセット)にタグを設定 buf.apply_tag(big_tag, buf.get_iter_at_offset(0), buf.get_iter_at_offset(3)) # バッファにテキストを追加 buf.insert(buf.get_end_iter(), "Hello, ") # バッファにテキストをタグを指定して追加 buf.insert_with_tags(buf.get_end_iter(), "world!\n", big_tag) # ビュー view = Gtk.TextView.new_with_buffer(buf) view.set_editable(False) view.set_cursor_visible(False) win.add(view) # スタート win.show_all() loop.run() ``` !例の実行結果