
GNOME 3 では、LibGlade から GtkBuilder への移行が必須になる。 この移行でなにがどうメリットなのかよく分からない割りに、 細かいところで面倒だったので、ちょっとまとめておく。 以下 PyGTK を事例としているが、他の言語でもまぁ似たようなものだろう。
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)
プログラムを国際化している場合は、さらに変更が必要である。
メッセージを含むファイルを羅列すればよいのだが、 現在の 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
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