33988


GTKでテキストウィジェットのテキストのスタイルを変えられますか？

  1. 色
  2. フォント
  3. 書体

リファレンスなどで探したのですが最新のバージョンで使えるものがありません。


CC BY-SA 3.0
2017-04-12T09:44:31.460
33950
2017-04-13T15:48:21.163
2017-04-13T15:41:27.007
3054
21169
question
c gtk gui
GTKでTextViewウィジェットのテキストのスタイルを変える


## 概要

まずは、[Text Widget
Overview](https://developer.gnome.org/gtk3/stable/TextWidget.html)
で概要をつかむのがよさそうです。  
スタイルの変更に関係が深そうな前半は、ざっと次のような内容です。

### バッファとビュー

`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
にあります](https://developer.gnome.org/gtk3/stable/index.html)。  
また、`gtk3-demo` というデモアプリケーションがあり、 これは Ubuntu であれば、`gtk-3-examples`
というパッケージに含まれていますが、以下のようにソースコードも閲覧出来るようになっています。

![gtk3-demo screen shot](https://i.stack.imgur.com/u1pJ5.png)

## 簡単な例

Python ですが、一応タグを使う例です。

[code]

    #!/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()
    
[/code]

![例の実行結果](https://i.stack.imgur.com/2H2TW.png)


CC BY-SA 3.0
2017-04-13T15:30:38.243
33988
2017-04-13T15:48:21.163
2017-04-13T15:48:21.163
3054
3054
33950
answer