
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 | 固定リンク
デスクトップ上に写真を表示するガジェット (フォトフレーム) は、 Windows なんかだとずいぶんさまざま公開されているけど、 GNOME デスクトップ向けだとちょっと高機能なものなど見あたらなかったので、 PyGTK で作ってみた。
GNOME 写真フレームは以下のパッケージに依存している。
また以下のパッケージが推奨されている。
2009/05/16 (Sat) 23:21 | タグ: computer | 固定リンク
GUI アプリ動作時にウェブにアクセスすると、その間 GUI が固まってしまう。 これを回避するにはウェブへのアクセスをバッググラウンドで行なう必要がある。 Gtk2-Perl の場合については以前書いたけど、 PyGTK なら Twisted を使えばとっても簡単。 これくらいなら、フォークとかスレッドとか細かな面倒を見なくて済む。
まずは必要なモジュールをインポート。 他のモジュールに先行してインポートした方がいいらしい。
from twisted.internet import gtk2reactor gtk2reactor.install() from twisted.internet import defer, reactor from twisted.web import clientウェブへのアクセスには getPage を使う。addCallback でアクセス終了後に呼び出す関数を指定する。 downloadPage では、ファイルへのダウンロードを行う。
d = client.getPage(url)
d.addCallback(func_cb)
def func_cb(data):
print data
メイン・ループについては、gtk.main() の代わりに reactor.run() で開始、 また終了についても、gtk.main_quit() の代わりに、reactor.stop() を使う。
reactor.run()
なお、プロキシーを利用する場合はちょっと面倒みたい。 簡単な方法はないのかな。
追記: 結局プロキシーを利用する適当なモジュールを自分で用意した。(2009/05/19)
2009/04/18 (Sat) 15:14 | タグ: computer | 固定リンク
gnome-terminal のというか libvte の East Asian Ambiguous 問題は、最新の libvte 0.17.4 では解決されている。 libvte 0.16.x ではうまく効かなかった環境変数 VTE_CJK_WIDTH だが、 libvte 0.17.4 では wide なり auto (locale で自動判定) なりを指定すればちゃんと効く。
一方、この libvte 0.17.4 では文字の間隔 (フォントの幅?) が妙に広くなってしまうという問題がある。 ただ、理由はよく分からないが、これは環境変数 VTE_BACKEND に pango を指定すれば、従来通りの幅で表示してくれる。
環境変数をどこで設定したらよいか分からなかったので、 ランチャに以下のように指定した。
env VTE_CJK_WIDTH=auto VTE_BACKEND=pango gnome-terminal --disable-factory
gnome-terminal もこれで快適。
2009/02/03 (Tue) 03:35 | タグ: computer | 固定リンク
F-Spot の日本語メッセージカタログを更新した。本家リポジトリの翻訳と、 Launchpad および Novell の翻訳をまとめ、未翻訳のところを訳した。 また、po ファイルではひとまずコメントアウトしてあるが、オリジナルの POT ファイルに含まれていない「設定」画面のメッセージも翻訳した。
その際、訳語や表記は基本的に相花さんの翻訳 (F-Spot や他の GNOME アプリ) に合わせ、その上で画像処理関係は GIMP の翻訳に、EXIF 関連や (写真用語) は EXIF の仕様書に合わた。
なお、ちょっと悩んだ翻訳に "Reparented" があった。 あまり使われる機能ではないが(コンパイルオプションの指定が必要)、 F-Spot のバージョン管理で使われるバージョンの一つで、 オリジナルの写真だったものを他の写真のバージョンの一つに変更させたものだ。 こちらはちょっと苦しく「再関連付け版」と訳した。
f-spot.mo を /usr/share/locale/ja/LC_MESSAGES/ なんかにコピーすれば、この翻訳が利用できる。
追記 1: 相花さんにエラーを修正の上コミットしていただいた。(2009/3/16 23:40)
追記 2: 0.6.x リリースにあわせて翻訳を更新した。 (2009/10/20 22:05)
2009/01/24 (Sat) 18:49 | タグ: computer | 固定リンク
Gtk2-Perl で Twitter クライアント Twitim を作った折りのメモ。 アプリ動作時にウェブにアクセスすると、その間 GUI が固まってしまう。 これを回避するにはウェブへのアクセスをバッググラウンドで行なう必要がある。 ちなみに、ちょっと哀しいけど結論だけなら 最後の「もっと簡単な方法」だけ読めば十分みたい。
バックグラウンド動作のための分岐には、 スレッドやフォークがある。このような目的で スレッドを簡単に使うには POE があるようだがちょっとおおげさすぎる。 スレッドは UNIX 環境以外でも使えるのだろうが面倒だし、 Gtk2-Perl の FAQ でもお勧めしないとある。 なお、ruby なら間違いなくスレッドなのだろう。 Gtk2-Perl のアプリではバックグラウンド動作の例があまり 見つからなかったが、gnview はスレッドを使っている。
今回は AnyEvent を使っていることもあり、なるべく単純にと伝統的なフォークを使う。 AnyEvent は Gtk のイベントとなら協調して動作するが、 スレッドとか POE とかとはどうなのか不安だったこともある。 ただフォークでも注意が必要。 子プロセスの終了には use POSIX; の上、POSIX::_exit(1) する必要あり。 そうしないと X のエラーが起こる。 FAQ に情報 あり。 またその返り値は必ず指定する。 指定しないと X のエラーが起こる。はまった。返り値はまぁ 1 でしょう。
今回はパイプを使う。 サンプル あり。pipe() をつかって、親と子を繋ぐ pipe ハンドラを指定する。 use IO::Handle; の上バッファに貯めないよう autoflush させた方がいい。 (なお、Net::XMPP2::Client; は IO::Handle;に依存)
また、同時に複数のパイプが開かれる場合があるので、 ファイルハンドルには未定義の変数をあて、Perl (5.6.0 以降) に自動的に生成してもらう。 ファイルハンドルに変数を使うことはできない。
子プロセスから読込んだデータを親プロセスで使うには、 子プロセスの終了を検知しなければならない。
AnyEvent で子プロセスの終了を検知したり、 ファイルハンドラの読み込みからコールバックしたりすることもできるが、 今回は Gtk の Helper->add_watch で ファイルハンドラの読み込みからのコールバックを使った。 サンプルあり。
親プロセスで、Helper->add_watch のセットをしておけば、 子プロセスの終了を待たず (たぶん)、データがある程度流れて来次第、 親プロセスでそのデータを随時処理できるようだ。 子プロセスでパイプを close されると、そこでデータの読み込みを終了する。
……と言うように実装してしばらくしてから、 Re: forking an external process: msg#00022 というそのものの記事を見つけた。 LWP::UserAgent でサブルーチンのリファレンスを引数として渡し、 その中で Gtk->main_iteration while Gtk->events_pending; を呼ぶという方法だ。 とても賢い。ちゃんと試してないが大抵のところこれで十分だろう。 気づくのが遅かった。
追記: いろいろ書いたけど、結局のところモジュール依存を気にしなければ、 AnyEvent-HTTP を使えば超簡単。お勧め。 (2009/4/18)
2008/05/21 (Wed) 01:28 | タグ: computer | 固定リンク
最新の開発情報については twitim - Google Code をどうぞ。
Twitim は Perl + GTK で実装された Twitter 専用の XMPP クライアントである。
汎用の IM (想定しているのは Pidgin) に似ているが、Twitter の利用の際に便利なように機能が追加されている。 追加されている機能は以下の通り。
Ubuntu では universe コンポーネントも追加しておく必要がある。
Debian (lenny) or Ubuntu (8.10)
deb http://www.tsurukawa.org/debian/lenny/ ./以下のコマンドで必要なモジュールを含めインストールできる。 サウンドやポップアップ機能を使うなら、 推奨パッケージもインストールが必要。
aptitude install twitim
Perl (v5.8 以降) が動作する環境とともに以下のモジュールが必要となる。
ライセンスは GPL 2 およびそれ以降。 なお、本アプリ中で利用しているアイコンは Pidgin由来のものである。 作者である Hylke Bons さんに感謝。 また、HyperText.pm というモジュールは、 Gtk2-Perl のサンプルを使い回したものなので、 こちらのライセンスのみオリジナルに従い LGPL 2.1 である。
Copyright © 2008 Yoshizumi Endo
Copyright © 2003-2008 gtk2-perl team (HyperText.pm)
Copyright © 1998-2007 Hylke Bons (Icons)
利用にあたっては完全無保証だが、 バグ報告などあればメールや Twitter (@yendo0206) でどうぞ。 Gnome っぽいシンプルなアイコンとか描いてみようとしたけどめげたので、 どなたか作ってくれたりすると嬉しい。
2008/05/03 (Sat) 22:45 | タグ: computer twitim | 固定リンク