yendo weblog


LibGlade から GtkBuilder への移行 (PyGTK 編)

GNOME 3 では、LibGlade から GtkBuilder への移行が必須になる。 この移行でなにがどうメリットなのかよく分からない割りに、 細かいところで面倒だったので、ちょっとまとめておく。 以下 PyGTK を事例としているが、他の言語でもまぁ似たようなものだろう。

Glade ファイル UI ファイルへの変換

Glade で変換する。LibGlade 形式のファイルを読み込んで、GtkBuider 形式で保存するだけ。バージョン 3.6.7 で問題なく変換できた。

コードの修正

ほぼ機械的に変更できるが、シグナルの接続など場合によってはちょっとした手作業も必要になる。

インポートとオブジェクトの取得

プロジェクトファイルの読み込み

これも基本的には機械的に置き換えできる。

旧:

gui = gtk.glade.XML(GLADE_FILE)

新:

gui = gtk.Builder()
gui.add_from_file(UI_FILE)

しかし、単一の Glade ファイルに複数のトップレベルが含まれ、それぞれでシグナ ルが設定されている場合は、シグナルの接続に問題が起こる。(すべてのシグナルに ついて接続されていないとか警告をしてくれる。) それを回避するためには、以下 のようにあるトップレベル以下のみを読み込むことも可能である。

gui.add_objects_from_file(UI_FILE, ["window1"])

ただ、この場合別のツリー以下にあるオブジェクトの呼び出しに問題が起こる。 例えば adjustment のようなウィジェットツリーとは別のオブジェクトツリー以下 にあるオブジェクトの場合である。

いろいろ面倒なことを考えるよりも、シグナルを扱うウィジェットは、別の ui ファイルにまとめた方がいい。

シグナルの接続

基本的には signal_autoconnect → connect_signals である。

ただ、LibGlade で は複数回にわたって多重にシグナル接続を重ねることができたが、GtkBuider では、最初に接続したシグナル以外は無視される。 クラスの継承などでシグナルを多段設定している場合などは注意が必要。

よく質問されているようだが、 とにかくシグナルの接続は一回で済ますように変更するしかないようだ。 例えば以下のようにする。

旧:

dic = { "on_checkbutton_changed" : self._changed_checkbutton_cb }
gui.connect_signals(dic)

dic = { "on_combobox_changed" : self._changed_combobox_cb }
gui.connect_signals(dic)

新:

dic = { "on_checkbutton_changed" : self._changed_checkbutton_cb }

dic2 = { "on_combobox_changed" : self._changed_combobox_cb }
dic.update(dic2)
gui.connect_signals(dic)

i18n関連

プログラムを国際化している場合は、さらに変更が必要である。

POTFILE.in

メッセージを含むファイルを羅列すればよいのだが、 現在の intltool バージョン 0.41.0 だと GtkBuider ファイルに対応していない。 ui ファイルが bonobo の ui ファイルと見なされ、処理されない。 そのため glade ファイル同様に扱われるように、ファイル名の先頭に [type: gettext/glade] を付与しておく。 main.ui と sub.ui のようなファイル名の場合は以下のようになる。

[type: gettext/glade]main.ui
[type: gettext/glade]sub.ui

bindtextdomain

gtk.glade の代わりに locale モジュールを使う。

import gettext
import locale

for module in (gettext, locale):
    module.bindtextdomain(APP_NAME, LOCALE_DIR)
    module.textdomain(APP_NAME)

参照サイト

2010/04/06 (Tue) 20:48 | タグ: computer


同じカテゴリの最新記事

  1. NetWalker 向けパッケージ (Twitim および GNOME Photo Frame)
  2. デスクトップアプリケーションで Facebook Graph API を使うときのポイント
  3. GNOME ドキュメントの作成と利用
  4. GNOME 写真フレーム
  5. PyGTK でのバックグラウンド動作