pygtkで遊ぼう(15) SourceView編

今日はSourceViewというgtk.TextViewベースのウィジェットを使ってみました。
使ってみたといっても、まだ作って配置してみたというレベルで、あまり深い部分の機能は使用していせんが。。。
SouceViewは、このブログでも先日紹介したエディタ、Scribesでも使用されています。

今回書いたスクリプトを実行すると、こんな感じの画面になります。


ソースコードは以下のような感じです。
下記のソースコードの赤文字の部分、今回ちょっと苦戦しました。
gtksourceviewのリファレンスによると、

SourceViewのコンストラクタの引数であるSourceBufferが省略された(つまりNone)場合には、新規にSourceBufferが作成される

とあったのですが、現状の実装とはちがっているのかもしれません。
SourceViewのコンストラクタを省略すると、SourceViewは作れるものの、Undo/Redoを行うと何やらエラーが。。。。
ためしに、SourceViewのメソッドget_buffer()でバッファを取得してタイプを調べてみるとgtk.TextBufferとなっていました。。。SourceBufferじゃない。。(汗

ということで、きちんとSourceBufferを作成して渡すようにしたところ、Undo/Redo時のエラーは発生しなくなりました。
(Undo/Redoの処理はプリント文だけです。。。ごめんなさい)


●追記
以下のソースコード中で、set_property()を沢山行っていますが、それらは専用のメソッドも存在します。例えば、set_margin(), set_tabs_width()とか。普通はそれらのメソッドを使う機会の方が多いと思います。今回set_property()を使ったのは、ゆくゆく外部の設定ファイルから設定を読み込んで設定させようと思っているので、同じメソッドで設定できたほうがスッキリとかけるかなと。

#-*- coding: utf-8 -*-

import sys
import pygtk
if sys.platform != 'win32':
    pygtk.require('2.0')
import gtk

from gtksourceview import SourceView, SourceBuffer, SourceTagTable

#
#
class SourceViewWindow:
    def __init__(self):
        self.wind = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.wind.set_size_request(400, 300)
        self.wind.set_position(gtk.WIN_POS_CENTER)
        self.wind.connect('delete-event', self.on_delete_event)

        scroll = gtk.ScrolledWindow()

        tb = SourceTagTable()
        bf = SourceBuffer(tb)
        self.srcView = SourceView(bf)
        self.srcView.connect('undo', self.on_undo)
        self.srcView.connect('redo', self.on_redo)
        scroll.add(self.srcView)

        # オートインデントをオンに。
        self.srcView.set_property('auto-indent', True)

        # タブの代わりに、スペースを使用するように設定
        self.srcView.set_property('insert-spaces-instead-of-tabs', True)

        # 左端のマージン(余白)を指定
        self.srcView.set_property('margin', 30)

        # 現在カーソルのある行をハイライトさせる
        self.srcView.set_property('highlight-current-line', True)

        # 行番号を表示
        self.srcView.set_property('show-line-numbers', True)

        # マーカを表示
        self.srcView.set_property('show-line-markers', True)

        # Home/Endキーで行頭、行末に移動する。
        # 単なる行頭、行末ではなく、行の最初・最後の文字に移動する。
        self.srcView.set_property('smart-home-end', True)

        # タブ幅を設定する。
        #self.scrollView.set_property('tabs-width', 4)

        self.wind.add(scroll)        
        self.wind.show_all()

    def on_delete_event(self, widget, event=None):
        print '-- quit --'
        gtk.main_quit()
        return True

    def on_redo(self, srcView, data=None):
        print '--redo--'
        return True

    def on_undo(self, srcView, data=None):
        print '--undo--'
        return True

#
#
if __name__ == '__main__':
    wind = SourceViewWindow()

    gtk.main()

自前の開発環境目指して、ちょっとづつ頑張ります!! ちょっとづつ。