Python GTK+3 チュートリアル

03. 基本的なこと

The Python GTK+ 3 Tutorial【3. Basics】にはサンプルコードがないので、説明文の翻訳だけ載せます。


ここでは、GTK+の重要なポイントを紹介していきます。

3.1. メインループとシグナル

多くのGUIツールキットと同様に、GTK+はイベント駆動型のプログラミングモデルを使用しています。ユーザーが何もしていない時、GTK+はメイン・ループに座して入力を待ちます。ユーザーがマウスクリックなどのアクションを行うと、メインループは「起きて」イベントをGTK+に発信します。

ウィジェットがイベントを受信すると、ウィジェットは頻繁に一つ以上のシグナルを発します。シグナルは、それに接続された関数を呼び出すことで、「何か面白いことが起こったよ」とプログラムに通知します。このような関数は、一般的にコールバックとして知られています。コールバックが呼び出されると、通常は何かアクションを起こすことになります。例えば、Openボタンがクリックされるとファイル選択ダイアログが表示されます。コールバックが終了すると、GTK+はメインループに戻りさらなるユーザ入力を待ちます。

一般的な例としては:

handler_id = widget.connect("event", callback, data)

まずウィジェットについて。GTKにはウィジェットと呼ばれる特定の機能を果たす小型のプログラムが数多く備えられています。プログラムで定義するウィジェットは、その小型プログラム群の中から必要に応じて選ばれたウィジェットのインスタンスです。次に興味のあるのはイベントですが、それぞれのウィジェットには、発生する可能性のある特定のイベントがあります。例えば、ボタンウィジェットの場合、通常は「クリックされた」というイベントと何らかの機能を接続したいでしょう。これは、ボタンがクリックされたというイベントが発生した時に"clicked"というシグナルが発行されることを意味します。三つ目、コールバックとは。引数callbackで指定されるのはコールバック関数の名前です。この関数には、指定したタイプのシグナルが発行されたときに実行されるコードが含まれています。最後に、引数dataには、シグナルが発行されたときに渡されるデータが含まれます。ただし、この引数は任意であり、必要がなければ省略できます。

ウィジェットで指定された関数は、この特定の「シグナル - コールバックのペア」を識別する番号を返します。接続されているシグナルが将来または現在進行中で放出される場合、コールバック関数が呼び出されないように信号から切断することが必要とされ、この識別番号が使われます。

widget.disconnect(handler_id)

何らかの理由で “handler_id” を失ってしまった場合 (例えば Gtk.Builder.connect_signals() を使用してハンドラをインストールした場合など)、関数 disconnect_by_func() を使用して特定のコールバックを切断することができます。

widget.disconnect_by_func(callback)

アプリケーションの終了時は、トップレベルのウィンドウの “destroy"シグナルにコールバックを接続する必要があります。“destroy"はオブジェクトが破壊されたときに発せられるシグナルなので、ユーザがトップレベルウィンドウを閉じるように要求した時、デフォルトではウィンドウを破壊しますがアプリケーションを終了させることはありません。トップレベルのウィンドウの “destroy"シグナルを関数 Gtk.main_quit() に接続することで、望んだ通りの動作が得られます。

window.connect("destroy", Gtk.main_quit)

Gtk.main_quit() を呼び出すと、Gtk.main() 内のメインループが戻ります。


3.2. プロパティ

プロパティは、ウィジェットの設定と状態を記述します。シグナルに関しては、各ウィジェットは独自のプロパティのセットを持っています。例えば、ボタンには、ボタン内のラベルウィジェットのテキストを含む「label」というプロパティがあります。ウィジェットのインスタンスを作成するときに、キーワード引数として任意の数のプロパティの名前と値を指定できます。テキスト “Hello World” 、25°の角度、右揃えのラベルを作成するには、以下のようにします。

label = Gtk.Label(label="Hello World", angle=25, halign=Gtk.Align.END)

これは以下のそれぞれに相当します。

label = Gtk.Label()
label.set_label("Hello World")
label.set_angle(25)
label.set_halign(Gtk.Align.END)

ゲッターとセッターを使う代わりに、 widget.props.props.prop_name = value のように、“props"プロパティを使ってオブジェクトのプロパティを取得したり設定したりすることもできます。これは、より冗長な widget.get_property(“prop-name”) と widget.set_property(“prop-name”, value) と同等です。

実行中のGTKのウィジェットで利用可能なプロパティを確認するには、“props"プロパティを “dir"することができます。

widget = Gtk.Box()
print(dir(widget.props))

これは Gtk.Box が持つプロパティのリストをコンソールに表示します。

Gtk.Box が持つプロパティのリストをコンソールに表示


関連記事