PyGTKのWidgetのプロパティを調べてみる


ふと興味がわいたので、試してみました。


何を試したかというと、

PyGTKのウィジェットのプロパティ一の種類や属性などの情報を取得してみる。

です。


なぜ、こんなことを考えたかというと、
自作のPyGTKアプリを作った時、ウィジェットの属性を設定するのに
いちいちプロパティを手書きでコード中に書くのは面倒だなぁ。。。と思ったからです。


で実際に試してみました。以下の実行結果は、gtk.Buttonのプロパティを表示してみたものです。
(print文で出力しただけなので、見にくいですが。。)
実行結果中の日本語説明文も、PyGTKから情報として取り出したものです。

[kani@arch-slime gtk]$ python properties.py 
user-data : [Read/Write]
	 --> 匿名のユーザ・データを指すポインタです
name : [Read/Write]
	 --> ウィジェットの名前を指定します
parent : [Read/Write]
	 --> このウィジェットの親です (コンテナ・ウィジェットにして下さい)
width-request : [Read/Write]
	 --> ウィジェットの要求する幅に上書きするか、通常の要求を使用する場合は -1
height-request : [Read/Write]
	 --> ウィジェットの要求する高さに上書きするか、通常の要求を使用する場合は -1
visible : [Read/Write]
	 --> ウィジェットが表示可能かどうかです
sensitive : [Read/Write]
	 --> ウィジェットは入力に応答するかどうかです
app-paintable : [Read/Write]
	 --> アプリケーションはウィジェット状で直接描画するかどうかです
can-focus : [Read/Write]
	 --> ウィジェットは入力フォーカスを受け付けるかどうかです
has-focus : [Read/Write]
	 --> ウィジェットは入力のフォーカスをもてるかどうかです
is-focus : [Read/Write]
	 --> ウィジェットがトップレベルの内側でフォーカス・ウィジェットであるかどうかです
can-default : [Read/Write]
	 --> ウィジェットがデフォルトのウィジェットになれるかどうかです
has-default : [Read/Write]
	 --> ウィジェットはデフォルトのウィジェットかどうかです
receives-default : [Read/Write]
	 --> TRUE にすると、ウィジェットにフォーカスが当たるとデフォルトの動作を受信する
composite-child : [Read]
	 --> ウィジェットがコンポジット・ウィジェットの一部であるかどうかです
style : [Read/Write]
	 --> ウィジェットのスタイルで、どのように見えるかという情報 (色など) を含む
events : [Read/Write]
	 --> このウィジェットがどの種類の GdkEvent を受信するかを決定するイベント・マスクです
extension-events : [Read/Write]
	 --> このウィジェットがどの種類の拡張イベントを受信するかを決定するマスクです
no-show-all : [Read/Write]
	 --> gtk_widget_show_all() がこのウィジェットに影響すべきでないかどうかです
has-tooltip : [Read/Write]
	 --> このウィジェットでツールチップを表示するかどうかです
tooltip-markup : [Read/Write]
	 --> このウィジェットのツールチップとして表示する内容です
tooltip-text : [Read/Write]
	 --> このウィジェットのツールチップとして表示する内容です
border-width : [Read/Write]
	 --> コンテナの子ウィジェットの外側にある空の境界線の幅を指定します
resize-mode : [Read/Write]
	 --> サイズ変更イベントをどのようにハンドルするかを指定します
child : [Write]
	 --> コンテナの新しい子ウィジェットとして利用できるかどうかです
label : [Read/Write]
	 --> ボタンがラベル・ウィジェットを含んでいる場合、そのボタン内のラベル・ウィジェット上の文字
image : [Read/Write]
	 --> ボタンのテキストの隣に表示する子ウィジェットです
relief : [Read/Write]
	 --> 枠の縁の外観
use-underline : [Read/Write]
	 --> セットすると、下線の次にある文字がアクセラレータ・キーのニーモニックとして使用する
use-stock : [Read/Write]
	 --> セットすると、ラベルはそれ自身が表示されるのではなく、ストック・アイテムから選択するための文字列として使用する
focus-on-click : [Read/Write]
	 --> マウスでクリックした時にボタンにフォーカスを当てるかどうかです
xalign : [Read/Write]
	 --> 利用可能なスペースでの子ウィジェットの水平位置 (0.0 で左寄せ、1.0 で右寄せ)
yalign : [Read/Write]
	 --> 利用可能なスペースでの子ウィジェットの垂直位置 (0.0 で上寄せ、1.0 で下寄せ)
image-position : [Read/Write]
	 --> テキストに関連する画像の位置


ソースコードは以下のとおりです。

# -*- coding: utf-8 -*-

import sys
import pygtk
if sys.platform != 'win32':
    pygtk.require('2.0')
import gtk
import gobject


if __name__ == '__main__':
    bt = gtk.Button('TestButton')

    for p in gobject.list_properties(bt):
        readWrite = []
        if p.flags & gobject.PARAM_READABLE:
            readWrite.append('Read')
        if p.flags & gobject.PARAM_WRITABLE:
            readWrite.append('Write')

        print '%s : [%s]' % (p.name, '/'.join(readWrite))
        print '\t --> %s' % p.blurb


なかなかいい感じです。
上記の情報をうまく使えば、Firefoxのabout:configのような感じでPyGtkのウィジェット
の属性を設定できるようなGUIも作れそうです。


いやはや、今日も勉強になりました。