言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

OLPC 開発その2。Sugar activity プログラミング。

では実際に、以下の資料を参考に Sugar アプリケーション (activity) を作ってゆきます。

作業の流れ

  • glade でガワを作る。
  • python で中身を作る。
  • Sugar との糊付けコードや設定ファイルなどを書く
  • インストール

activity とは、ソフトウェアの実行に必要なひとまとまりのファイルを集めた物です。activity には、システムに最初から入ってるやつと、ユーザが後から入れるやつがあります。普通の linux アプリと違う所は、activity がどんなディレクトリにあってもちゃんと動くように作らないといけない所です。完成した暁には次のようなファイルが出来ているはずです。

  • GtkhelloActivity/MANIFEST - ファイルのリスト
  • GtkhelloActivity/gtkhello.py - 本体
  • GtkhelloActivity/gtkhello.glade - GUI 定義ファイル
  • GtkhelloActivity/GtkhelloActivity.py - エントリポイント
  • GtkhelloActivity/setup.py - インストールスクリプト
  • GtkhelloActivity/activity/activity.info - activity 設定ファイル
  • GtkhelloActivity/activity/gtkhello.svg - アイコン

glade でガワを作る。

  • New GTK+ Project
  • パレットからウインドウを取り出す。
  • Vertical box を出す。vbox1 と名付ける。
  • 上の箱に Text Entry を出す。entry1 と名付ける。
  • 下の箱に Button を出す。button1 と名付ける。
  • 出したボタンをクリック
  • Signals タブ。
  • Signal: の ... を押して clicked を選択
  • Handler が on_button1_clicked であることを確認して Add
  • GtkhelloActivity/gtkhello.glade という名前でセーブ

python で中身を作る。

本体である gtkhello.py の内容はこんな感じです。

#!/usr/bin/env python
import os
import sys
import pygtk
pygtk.require("2.0")
import gtk
import gtk.glade
from sugar.activity import activity

class gtkhello:
    
    def __init__(self):
        gladename = os.path.join(activity.get_bundle_path(), 'gtkhello.glade')
        self.wTree = gtk.glade.XML(gladename, 'vbox1')
        self.vbox = self.wTree.get_widget('vbox1')
        self.text = self.wTree.get_widget('entry1')
        self.wTree.signal_autoconnect(self)

    def on_button1_clicked(self, widget):
        self.text.set_text("Hello World!")

if __name__ == "__main__":
    os.environ['SUGAR_BUNDLE_PATH'] = '.'
    window = gtk.Window()
    window.connect("destroy", gtk.main_quit)
    
    hwg = gtkhello()
    window.add(hwg.vbox)
    window.show()
    gtk.main()

ポイント

  • gtk.glade.XMLGUI 部品を取り出すとき、ウインドウは省略して vbox1 以下だけ取り出す。ウインドウは suar から提供されるからです。
  • if __name__ を使って、sugar 環境の外からでもテスト出来るようにしておきます。

以下のようにしてテストが出来ます。

$ (path_to_sugar)/sugar-jhbuild/sugar-jhbuild shell # 環境変数の設定
$ ./gtkhello.py

Sugar との糊付けコードや設定ファイルなどを書く

エントリポイント GtkhelloActivity.py はこんな感じ Gtkhello の vbox を sugar に与えられたウインドウに追加するだけです。

from sugar.activity import activity
from gtkhello import gtkhello

class GtkhelloActivity(activity.Activity):
    def __init__(self, handle):
        activity.Activity.__init__(self, handle)
        self.set_title('Gtk Hello world')
        hello = gtkhello()
        self.add(hello.vbox)

あと、setup.py と言うのも必要みたいです。

from sugar.activity import bundlebuilder
bundlebuilder.start()

activity ディレクトリには、設定ファイルとアイコンが必要です。アイコンは適当にコピペしてくるとして、activity.info の方は

[Activity]
name = Gtkhello
id = org.metatoys.Gtkhello
service_name = org.metatoys.propella.Gtkhello
class = GtkhelloActivity.GtkhelloActivity
icon = gtkhello
show_launcher = yes
activity_version = 1
host_version = 1

最後に MANIFEST を書きます。ここに書いた物と + activity/ が、パッケージの対象になります。

gtkhello.glade
gtkhello.py
gtkhelloActivity.py

インストール

インストールは以下のようにします。

$ (path_to_sugar)/sugar-jhbuild/sugar-jhbuild shell # 環境変数の設定
$ ./setup.py dev

これで、~/Activity というディレクトリが作られ、GtkhelloActivty ディレクトリへのシンボリックリンクが作られます。 sugar は起動時に ~/Activity ディレクトリから activity を検索します。

これでばりばり OLPC アプリを作る事が出来ます。