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

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

PyGTK + Gladeのアプリケーションにおけるハンドラ関数について(前半)

PyGTKとGladeについて」で書いたように、GTK+のアプリケーションは、GUI部品(ウィジェット)上でユーザが行う操作をとらえて、それに対応付けられた関数を呼び出す仕組みになっている。
開発者はその操作の内容として「シグナル」を選択し、呼び出される関数(ハンドラ関数)を指定することで関連付けを行うのだが、ここでは、その関数についての注意点をまとめておく。
なお、コードはクラスを用いて書くものとする。

ハンドラ関数の引数はシグナルの種類によって異なる場合がある

最初の引数「self」の後ろには、そのウィジェットを示すオブジェクトが入る。これは「widget」などの名前で使用されることが多いようだ。
ウィジェットによっては、この後ろに追加のデータを受け取るものがある。引数の数が不正だと処理が正常に行われないため、どのような引数が渡されるのかを調べる必要のある場合がある。

必要な引数を調べる

調べ方としては、リファレンスの「[PyGTK内のクラス名] Signal Prototypes」の「def callback()」の中を見る。例えばgtk.Dialog(とその子クラス)に固有なシグナルとして「response」があるが
[引用] http://www.pygtk.org/docs/pygtk/class-gtkdialog.html#signal-prototypes-gtkdialog より

"response"
	def callback(dialog, response_id, user_param1, ...)

このシグナル「response」に関連付けた関数は、「self」の後ろにダイアログ(ウィジェット)のオブジェクトとレスポンスID*1の2つの引数をとることを示す。
「user_param1, ...」は、その後ろに好きなデータを(いくつでも)付けて渡すことができることを示し、ユーザ・データと呼ばれる任意のデータを受け取ることができる。

複数のシグナルに関連付けたハンドラ関数の引数

ハンドラ関数の引数の数はシグナルの種類によって異なることがあるため、複数のシグナルから実行される*2関数の場合に、引数の数が「片方では合い、片方では合わない」ということになる可能性がある。関数内である引数が使用されなくても、引数の数については正しく記述しておく必要があり、このような場合では「既定の引数をNoneにする」とうまくいくことがある。例えば

  def func(self, widget, event=None):

と書いた場合、ウィジェットのオブジェクトのみを渡すシグナルの場合と、もう1つの引数(event)を追加でとるシグナルの場合の両方に対応できる。


PyGTK + Gladeのアプリケーションにおけるハンドラ関数について(後半)」に続く

関連記事:

使用したバージョン:

  • PyGTK 2.12.0
  • Glade 3.4.4

*1:ダイアログを閉じるときに押したボタンの種類やその他の状態

*2:「メニュー項目から選択もしくはボタンのクリック」など、ある操作を行うのに複数のやり方を用意するとき