試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

PyGTKとGladeについて

ここでは、PyGTKの概要とGladeに関してのみを扱う。gladeファイルを用いたサンプルは別記事にて。

PyGTKについて

PyGTK(http://www.pygtk.org/)は、GTK+Pythonから扱ってGUIアプリケーションを比較的楽に作成するためのPythonのモジュール群。Glade(http://glade.gnome.org/)*1が作成するXMLファイルを扱う機能(gtk.glade)も標準で用意されているため、アプリケーションのインターフェース(見た目)に関する情報を内部の処理から分離することもできる。*2
(2010/6/21)Gladeファイルを扱う機能はlibgladeという外部ライブラリにあったが、GTK+/PyGTKのバージョン2.12以上からGTK+自体に類似のGtkBuilder(C言語 Python)という機能が追加され、libgladeはGTK+のバージョン3系からは廃止される。今後はlibgladeの代わりにGtkBuilderを用いることになる。

GTK+におけるGUI部品配置方式について

PyGTKに限らず、GTK+のアプリケーションでは、1つのGUI部品(以下「ウィジェット」)を1つの空き*3に入れると、その空き全体を占有する。例えば、新しくウィンドウを作成したとして、その中にボタンを1つ配置したとすると、ウィンドウ全体に大きなボタンが1つ居座って、他のウィジェットの入る場所はなくなる。Gladeで配置をする際にも、この点には注意する必要がある。
GTK+アプリケーションのウィジェットの配置の形としては、場所の「分割」が基本となる。これには、1つの空き場所を分割するための入れ物(コンテナ)*4を使用し、分割された各スペースにウィジェットを配置するか、もしくはコンテナを更に配置していって、インターフェースのレイアウトを作っていくことになる。
ウィジェットの配置に関しての詳細な設定は、Gladeウィジェットのプロパティ表示にある「パッキング」タブで行える。ここでは、ウィジェットがスペースをどのように使用するかの設定が行える。また、この隣にある「共通」タブには、ウィジェット共通の色々な設定項目がある。
分割コンテナ(GtkVBoxやGtkHBox)の分割数は配置時に指定することになるが、これを後から変更するには、プロパティ表示の「全般」タブから指定し直す。

シグナルの接続: ユーザの操作と処理との関連付け

GUIのアプリケーションは、ユーザがボタンを押したりメニュー項目を選択したりなど、何かアクションを起こしたときに、それに対応した処理を呼び出す仕組みで動作している。*5アプリ起動後に何もしなければそのまま動作し続ける(内部的に無限ループしている)。
GTK+では、特定のウィジェット上で特定の操作が行われたときに「シグナル」*6が発生し、開発者はその操作が行われたときに呼び出される関数(イベントハンドラ)とこの「シグナル」とを関連付けることになる。これにより、アプリケーション内での(特定の)操作による(特定の)処理の実行を実現する。
シグナル接続はプログラム上で個別に記述する*7こともできるが、Gladeでは、ウィジェットのプロパティにある「シグナル」タブで、そのウィジェットの種類で使用されるシグナルが表示され、この中から、自分がとらえたい操作に対応するシグナルを選んで、呼び出される関数名を記述することでこの関連付けを行うことができる。
コード側では、gtk.glade.XMLのオブジェクトを作成後、signal_autoconnect()というメンバ関数を実行するだけでよい。引数に「self」を指定すると、gladeファイルに保存した関連付けを適用する。別途、シグナル接続用の辞書を用意してそれを渡すことで指定することもできる。

PyGTKのデモについて

GTK+ 2のgtk-demoというデモに近いpygtk-demoが用意されていて、コードを参考にすることができる。ただ、C言語版と同様、gladeファイルは使用せずに、ユーザインターフェースの組み立てを行うコードと処理を行うコードが混在しているので、見づらいかもしれない。

関連記事:

関連URL(全て英語):

使用したバージョン:

  • PyGTK 2.12.0
  • Glade 3.4.4

*1:ここで扱うのはバージョン3系

*2:これを使わない場合、ユーザインターフェースの部品を1つ1つ配置し、その色々な設定を行ったりする作業をプログラム中で書くことになる

*3:ウィジェットを入れられる部分

*4:基本的なものとしては縦方向分割(GtkVBox)や横方向分割(GtkHBox)があるが、GtkTextView(テキスト)やGtkTreeView(リストやツリー)を子ウィジェットとしてスクロール機能を提供するGtkScrolledWindowのようなものも存在する

*5:このような形のプログラムはイベント駆動(イベントドリブン)型プログラムと呼ばれる

*6:UNIX系OS上のシグナルとは異なり、GLib/GObjectライブラリにおける独自の概念

*7:ウィジェットオブジェクトの(実際にはベースとなるgobject.GObjectというクラスの)メンバ関数connect()(リファレンス)を使用