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

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

ウィンドウ、システムトレイ、バージョン情報ダイアログでアイコンを指定(覚え書き)

ここでは、PyGTKを使用して、ウィンドウ(ダイアログも同様)・システムトレイのアイコンやバージョン情報ダイアログのロゴといったところでアイコン画像を指定する方法についてを扱う。
スペースの関係で、ここでは覚え書きのみを書き、コード例は別記事で扱う。

ウィンドウやダイアログのアイコン

ここで指定したアイコン画像は、パネルのウィンドウ一覧やウィンドウマネージャ装飾上、他にはCompiz Fusionの「スケール」プラグイン使用時の画像といったところなどでも使用される。

  • gtk.Windowオブジェクトのメンバ関数set_icon_from_file()を使用すると、画像ファイルの場所を引数に指定することで、その画像をアイコンとして使用できる・画像形式は自動検出されるが、PNGかXPMが使用されることが多い
  • 同様にメンバ関数set_icon()で画像データを指定することもできるが、ここで指定するのは後述のgtk.gdk.Pixbufオブジェクト
  • メンバ関数set_icon_name()ではアイコン名による指定ができる

アイコン名による指定というのは、/usr/share/icons/[使用しているアイコンテーマ名]/以下や/usr/share/pixmaps/以下にある画像ファイルのファイル名から拡張子を除いた部分(アイコン名)を指定するもの。

システムトレイのアイコン

gtk.StatusIconオブジェクトの以下のメンバ関数を使用してアイコンを設定する。

  • set_from_file()は画像ファイルの場所を指定して開く
  • set_from_pixbuf()gtk.gdk.Pixbufオブジェクトを使用する形
  • set_from_icon_name()はアイコン名による指定ができる
  • set_from_stock()では、アイコンテーマのストックアイコン*1を「gtk.STOCK_QUIT」のような形で引数に指定する

ストックアイコンの一覧は、デモプログラムpygtk-demo*2にある「Stock Item and Icon Browser」が便利。

バージョン情報ダイアログのロゴアイコン

  • set_logo()gtk.gdk.Pixbufオブジェクトによる指定
  • set_logo_icon_name()はアイコン名による指定

ファイルから直接読み込みたい場合はset_logo()の引数にgtk.gdk.pixbuf_new_from_file()を指定するしかない?

gtk.gdk.Pixbufオブジェクト関係

表示可能な画像データを持つgtk.gdk.Pixbufオブジェクトは色々なところで使える。

gtk.gdk.Pixbufオブジェクトを生成する関数について
  • gtk.Windowやgtk.StatusIconにはファイルから直接読み込むためのメンバ関数があるため関係ないが、gtk.gdk.pixbuf_new_from_file()gtk.gdk.pixbuf_new_from_file_at_size()で、ファイルの場所を指定することでgtk.gdk.Pixbufオブジェクトを得ることができる
  • コード中に記述されたXPM画像のリスト型データを用意してgtk.gdk.pixbuf_new_from_xpm_data()を呼ぶと、その画像のgtk.gdk.Pixbufオブジェクトが得られる
XPMアイコンの埋め込み方

gtk.gdk.pixbuf_new_from_xpm_data()で使用するXPMデータは、文字列のリストとして埋め込む(C言語の形式のままではダメ)。
例えば
ファイル名: testicon.xpm

/* XPM */
static char * testicon_xpm[] = {
"48 48 2 1",
" 	c None",
".	c #66C8FF",
"                                                ",
"                                                ",
"                       ..                       ",
"                       ..                       ",
"                       ..                       ",
"                      ....                      ",
"                      ....                      ",
"                      ....                      ",
"                     ......                     ",
"                     ......                     ",
"                     ......                     ",
"                    ........                    ",
"                    ........                    ",
"                    ........                    ",
"                   ..........                   ",
"                   ..........                   ",
"                   ..........                   ",
"                  ............                  ",
"   ..........................................   ",
" .............................................. ",
"   ..........................................   ",
"    ........................................    ",
"     ......................................     ",
"      ....................................      ",
"        ................................        ",
"         ..............................         ",
"          ............................          ",
"            ........................            ",
"             ......................             ",
"              ....................              ",
"              ....................              ",
"              ....................              ",
"              ....................              ",
"             ......................             ",
"             ......................             ",
"             ......................             ",
"            ........................            ",
"            ...........  ...........            ",
"            .........      .........            ",
"           .........        .........           ",
"           .......            .......           ",
"           ......              ......           ",
"           .....                .....           ",
"          ....                    ....          ",
"          ...                      ...          ",
"          .                          .          ",
"                                                ",
"                                                "};

というXPMファイルを埋め込むためには

testicon_xpm = ["48 48 2 1",
  " 	c None",
  ".	c #66C8FF",
  "                                                ",
  "                                                ",
  "                       ..                       ",
  "                       ..                       ",
  "                       ..                       ",
(中略)
  "          ....                    ....          ",
  "          ...                      ...          ",
  "          .                          .          ",
  "                                                ",
  "                                                ",]

のようにしてPythonの文法でリストに格納してから引数に指定する。最初と最後だけはいじるが、途中の文字列配列の部分はそのまま。

参考URL:

*1:ユーザインターフェース上で使用される基本的なアイコン

*2:Ubuntuでは「python-gtk2-doc」パッケージに含まれるが、Debianにはない?その場合、「gtk2.0-examples」に含まれるC言語版のデモgtk-demoを参考にすることも可能