試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

GtkSourceViewの色付き表示(シンタックス・ハイライティング)機能の動作について(ページ3/3)

GtkSourceViewの色付き表示(シンタックス・ハイライティング)機能の動作について(ページ2/3)」の続きで「実際の処理の流れ」内の続きからとなる。

色スキームの指定

下は「tango」の色スキームを指定する例。

    self.__sourcebuf.set_style_scheme(self.__ssm.get_scheme('tango'))
ビューオブジェクトの作成

コンストラクタ引数にバッファオブジェクトを指定する。

    self.__sourceview = gtksourceview2.View(self.__sourcebuf)

その後好みでフォントを変更する。pango.FontDescriptionオブジェクト(「ファミリ名/(スタイル/)サイズ」をコンストラクタ引数に指定)をメンバ関数modify_font()に渡す。

    self.__sourceview.modify_font(pango.FontDescription('Monospace 8'))

スクリプトの先頭ではpangoモジュールをimportしておく。

ScrolledWindowに入れる

他のスクロールさせるGUI部品(テキストビューやツリービューなど)と同様、スクロールバーを付けてスクロールできるようにする。

    self.__sw = gtk.ScrolledWindow()
    self.__sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
    self.__sw.add(self.__sourceview)

この後は他のGUI部品と同様にScrolledWindowを配置する。

このPythonスクリプトの内容をPythonスクリプトとして色付き表示し、「tango」の色スキームを用いて表示する。

[任意]ファイル名: gtksourceviewtest2.py

#! /usr/bin/python
# -*- coding: utf-8 -*-

import sys
try:
  import pygtk
  pygtk.require('2.0')
except:
  pass
try:
  import pango
  import gtk
except:
  print >> sys.stderr, 'Error: PyGTK is not installed'
  sys.exit(1)
try:
  import gtksourceview2
except:
  print >> sys.stderr, 'Error: PyGtkSourceView is not installed'
  sys.exit(1)


class MainWindow(gtk.Window):
  """
  メインウィンドウ
  """
  def __init__(self, *args, **kwargs):
    gtk.Window.__init__(self, *args, **kwargs)
    # ショートカットキー(アクセラレータ)
    self.__accelgroup = gtk.AccelGroup()
    self.add_accel_group(self.__accelgroup)
    # メニュー項目
    self.__item_quit = gtk.ImageMenuItem(gtk.STOCK_QUIT, self.__accelgroup)
    self.__menu_file = gtk.Menu()
    self.__menu_file.add(self.__item_quit)
    self.__item_file = gtk.MenuItem('_File')
    self.__item_file.props.submenu = self.__menu_file
    self.__menubar = gtk.MenuBar()
    self.__menubar.append(self.__item_file)
    # ソースビュー関係
    # 言語マネージャとスタイルスキームマネージャ
    self.__lm = gtksourceview2.language_manager_get_default()
    self.__ssm = gtksourceview2.style_scheme_manager_get_default()
    # 言語マネージャのguess_language()でファイルを読ませて
    # 言語を推測することができる
    guessed_lang = self.__lm.guess_language(filename=__file__)
    if guessed_lang:
      self.__sourcebuf = gtksourceview2.Buffer(language=guessed_lang)
    else:
      self.__sourcebuf = gtksourceview2.Buffer()
      # 言語マネージャのget_language()で名前を指定することで手動での指定もできる
      # 指定された名前の言語が得られない場合Noneが返る
      lang = self.__lm.get_language('python')
      # GObjectプロパティlanguageへの代入による指定/変更もできる
      self.__sourcebuf.props.language = lang
      # 下は代わりにlanguage引数に直接入れた場合
      #self.__sourcebuf = gtksourceview2.Buffer(language=self.__lm.get_language('python'))
    self.__sourcebuf.set_style_scheme(self.__ssm.get_scheme('tango'))
    # このスクリプトの内容を読み込んで表示する
    f_in = open(__file__, 'r')
    # begin_not_undoable_action()からnot_undoable_action()までの間の操作は
    # 取り消し(undo)可能なものとして記録されないようになる
    self.__sourcebuf.begin_not_undoable_action()
    self.__sourcebuf.props.text = f_in.read()
    self.__sourcebuf.end_not_undoable_action()
    f_in.close()
    self.__sourceview = gtksourceview2.View(self.__sourcebuf)
    self.__sourceview.modify_font(pango.FontDescription('Monospace 8'))
    self.__sw = gtk.ScrolledWindow()
    self.__sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
    self.__sw.add(self.__sourceview)
    # レイアウト用コンテナ
    self.__vbox = gtk.VBox()
    self.__vbox.pack_start(self.__menubar, expand=False, fill=False)
    self.__vbox.pack_start(self.__sw)
    # シグナル
    self.connect('delete_event', gtk.main_quit)
    self.__item_quit.connect('activate', gtk.main_quit)
    # ウィンドウ
    self.add(self.__vbox)
    self.set_size_request(300, 200)
    self.resize(450, 260)
    self.props.title = 'Python GtkSourceView Test'

class PyGtkSourceViewTest2:
  """
  GtkSourceViewのテスト2
  """
  def main(self):
    """
    アプリケーションのメイン処理
    """
    win = MainWindow()
    win.show_all()
    gtk.main()


if __name__ == '__main__':
  app = PyGtkSourceViewTest2()
  app.main()

関連記事:

使用したバージョン:

  • Python 2.6.4
  • PyGTK 2.16.0
  • PyGtkSourceView 2.8.0