PyGTK と Glade を使った GUI の作り方
Creating a GUI using PyGTK and Glade by Mark Mruss
Tkinter を使って GUI の作成をしてきて、それはとても簡単にできたんだけど、Tkinter が僕のコードと GUI をリンクするやりかたに不満があって、他のツールキットを使って GUI を作ることを検討することにした。いろんなオプションを調べた後、僕は PyGTK と Glade を使うことに決めた。
僕がその2つを使うことに決めた理由は、それらがクロスプラットフォーム [訳注:Linux や Windows や Mac OSX などのいろんな OS で動作するソフト] であることと、GLADE はコードと GUI を分けたいという僕の要望に応えてくれるからだ。
Glade なんて聞いたことないという人に説明するなら、それは「GTK+ と GNOME のためのユーザーインターフェース作成ソフト」だ。目的の GUI を記述する XML ファイルを作ってくれる。
pyGTK の説明は pyGTK のサイトにある通りだ:
PyGTK は Python プログラムで使用するための GTK+ ライブラリの便利なラッパーです。メモリ管理や型変換などの退屈な詳細の面倒を見てくれます。PyORBit、gnome-python と組み合わせれば、フル機能の Gnome アプリケーションを作成することができます。
さあ始めようか。僕はこの文書を入れたての Debian システムで書いている。もし Debian や、Debian ベースのディストリビューション [訳注:例えば Ubuntu Linux など] を使っているなら、PyGTK と Glade を入手方法はとてもシンプルだ [さらに訳注: Fedora Core 5 では「Add/Remove Software」で gtk と glade のパッケージを選択すればいい]:
apt-get install python-gtk2 python-glade2
手始めにシンプルな GUI を作ってみよう。これが GLADE をはじめてスタートさせたときの画面だ:

まずするべきなのは、「新規」で 「GTK+ プロジェクト」を選んでから、パレットの「ウィンドウ」ボタンを押してベースのウィンドウを作ることだ。そして「プロパティ」でそのウィンドウのプロパティを編集する。

このウィンドウには MainWindow という名前をつけることにして、タイトルを "Hello World... Again!" にセットすることにしよう。
もし Visual Studio のような統合された GUI 作成ソフトを使ったことがあるなら、glade ははじめ少し変に感じるかもしれない。コントロールをスクリーンの好きなところに配置するんじゃなくて、代わりにそれらを「パックする」 [訳注:まとめること] からね。妙だけど(少なくとも僕にとっては)、これがほとんどの GUI 作成ソフトが動作する普通のやり方に思えるし、 Visual Studio のようなアプリケーションが実際には変わっているのだと思う。
ともかく、チュートリアルに戻ることにして、はじめにすることは、ユーザにボタンを押すように伝えるラベルを追加することだ(もちろんボタンの上にテキストを乗せることもできるけど、1つのウィジットだけじゃ楽しくないでしょ?)。GTK はウィジットをまとめるのにコンテナを使うから、はじめにコンテナを追加することになる。ラベルをボタンの上に配置する計画だから、2行の「垂直ボックス」を使う。「垂直ボックス」を追加するには、Glade パレットのそれをただクリックして、それからメイン・ウィンドウ (MainWindow) をクリックすればいい。小さなダイアログが出てきて何行にしたいかを聞いてくるから、ここでは「2」と入力する。
次にするのは、パレットの「ラベル」ボタンをクリックして、さっき作ったコンテナの1行目をクリックしてラベルを追加すること。デフォルトの名前はそのままにして、テキストを "Please click on the button!" に変えてみよう。テキストを変更するのは、もう気づいてるだろうけど、ウィジェットのプロパティを表示・編集をすることができる Glade プロパティのウィンドウを使ってやる。
次は、ラベルのウィジェットを追加したようにボタンを追加する。さっきとの違いは、2行目ということ。このボタンの名前は btnHelloWorld にすることにして、ラベルを "Click me!" に変えてみよう。
ここでプロジェクト・オプションを設定する必要がある。ここではプロジェクト名を PyHelloWorld と呼ぶことにして、projects/PyHelloWorld フォルダに保存しよう。

これだけ。PyHelloWorld フォルダを見れば、.glade と、 glade の GUI XML ファイルである .gladep という拡張子の2つのファイルが作成されているのが分かるだろう。

ここで glade ファイルを読み込んで表示させる Python プログラムを作ろう。同じフォルダに PyHelloWorld.py というテキスト・ファイルをまず作る。
はじめにしなければいけないのは、プロジェクトで必要なすべてのライブラリをインポートすることだ:
#!/usr/bin/env python
import sys
try:
import pygtk
pygtk.require("2.0")
except:
pass
try:
import gtk
import gtk.glade
except:
sys.exit(1)
次にメインのクラスを作る。これは HellowWorldGTK [訳注:原文で Hello'w'World となっているのでそれに合わせた。合わせなくていいのに] と呼ぶことにする。次に glade ファイルを読み込むための __init__ 関数を書く:
class HellowWorldGTK:
"""This is an Hello World GTK application"""
def __init__(self):
#Set the Glade file
self.gladefile = "pyhelloworld.glade"
self.wTree = gtk.glade.XML(self.gladefile)
#Get the Main Window, and connect the "destroy" event
self.window = self.wTree.get_widget("MainWindow")
if (self.window):
self.window.connect("destroy", gtk.main_quit)
(クラスを定義したあとに)はじめにすることは、使用する glade ファイルを指定して、gtk.glade.XML オブジェクトを glade ファイルを使って作ることだ。以下は pyGTK2 リファレンスからの gtk.glade.XML オブジェクトに関する記述:
このオブジェクトは XML インターフェース記述の「インスタンス化」を請け負います。このオブジェクトが作られたとき、対応する XML ファイルが読まれ、対応するインターフェースが作成されます。そして gtk.glade.XML オブジェクトは、そのインターフェースのウィジットに、それらに割り当てられた名前によってアクセスするためのインターフェースを提供します。
gtk.glade.XML オブジェクトは、ハンドラと XML 記述の中の名前が付けられたシグナルをつなげる(connect)のにも使われます。Libglade はさらにプログラムのシンボル・テーブルからハンドラの名前を調べて自動的にその方法で調べることのできるハンドラをつなげるインターフェースを提供します。
つまり gtk.glade.XML オブジェクトを作ってやっていることは、メインのインターフェースを作って読み込んでいるってことだ。
次にやることは、メイン・ウィンドウへのインターフェースを取得して「破壊(destroy)」イベントと get.main_quit() 関数とつなげることだ。これは要するにメイン・ウィンドウが閉じられたときにアプリケーションを終了するってこと。そうしないとアプリケーションはメイン・ウィンドウが閉じられても走りつづけてしまう(こんなのはイヤだ)。
これで HellowWorldGTK クラスについては終わり。次にやらなければいけないのは、そのクラスにインスタンスを作って GTK メイン・ループをスタートすること:
if __name__ == "__main__":
hwg = HellowWorldGTK()
gtk.main()
これでいい。簡単だね。このファイルを走らせれば、ウィンドウを閉じたときに終了する以外は何もしない GTK ウィンドウが現れるだろう。

次のステップは、ボタン・クリックのイベントと関数をつなげることだ。これをやるには、また Glade を使ってインターフェースを編集する。
メイン・ウィンドウでボタンのオブジェクトを選んでプロパティ・ウィンドウで「シグナル」のタブを選んでみよう。シグナル・ブラウザ・ボタン [訳注:下の画像の1番] をクリックして、"clicked" を選んで、追加ボタン [下の画像の2番] を押せば、新しいシグナルを追加できる。これはデフォルトで “on_btnHelloWorld_clicked” というハンドラを作る。この名前を好きなように変えることもできるけど、今のところはデフォルトのまま使うことにしよう。

これで Glade での作業は終わり。これからするのは、そのイベントとこれから書くコードをつなぐこと。幸いこれは gtk.glade.XML.signal_autoconnect 関数を使ってとても簡単にできる。
#Create our dictionay and connect it
dic = { "on_btnHelloWorld_clicked" : self.btnHelloWorld_clicked,
"on_MainWindow_destroy" : gtk.main_quit }
self.wTree.signal_autoconnect(dic)
基本的にはイベント名とそれにつなげる関数名を使った辞書が作られる。ボタン・クリックのイベントが新しい関数に、そして “on_MainWindow_destroy” イベントが gtk.main_quit() 関数につなげられているのが分かるだろう。このコードは、上で作った、ウィンドウが閉じたときにプログラムを終了するコードの代替になるものだ。もしそのバージョンの辞書が使いたいなら、glade で破壊イベントをメイン・ウィンドウに追加すればいい。
次にするのは、btnHelloWorld_clicked 関数を HellowWorldGTK クラスに作ることだ:
def btnHelloWorld_clicked(self, widget):
print "Hello World!"
シンプルだね。これでプログラムを走らせて、“Click Me!” ボタンを押すと、コマンドラインに “Hello World!” と表示される。
これでレッスンは終わり。今のところ僕は PyGTK と Glade の動作がとても気に入っている。以下にすべてのソースを示しておく:
#!/usr/bin/env python
import sys
try:
import pygtk
pygtk.require("2.0")
except:
pass
try:
import gtk
import gtk.glade
except:
sys.exit(1)
class HellowWorldGTK:
"""This is an Hello World GTK application"""
def __init__(self):
#Set the Glade file
self.gladefile = "pyhelloworld.glade"
self.wTree = gtk.glade.XML(self.gladefile)
#Create our dictionay and connect it
dic = { "on_btnHelloWorld_clicked" : self.btnHelloWorld_clicked,
"on_MainWindow_destroy" : gtk.main_quit }
self.wTree.signal_autoconnect(dic)
def btnHelloWorld_clicked(self, widget):
print "Hello World!"
if __name__ == "__main__":
hwg = HellowWorldGTK()
gtk.main()
役に立つリンク:
http://www.linuxjournal.com/article/6586
http://www.async.com.br/~kiko/pygtk-web/articles/bitpodder/BitPodder.htm
http://www.linuxjournal.com/article/7421
http://www.pygtk.org/articles.html
http://www.pygtk.org/tutorial.html
0 comments:
Post a Comment