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

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

PyGTKでシステムトレイのアイコンを切り換える(前半)

システムトレイに常駐するアプリケーションの中には、状態に応じてアイコン画像を変更するものがある。
ここでは、PyGTKを使用したシステムトレイアプリケーションにおけるアイコン変更の仕方を扱う。

アイコン変更の方法

gtk.StatusIconオブジェクトには、アイコンを指定するのに使用する

  • set_from_pixmap()
  • set_from_file()
  • set_from_stock()
  • set_from_icon_name()

といったメンバ関数があるのだが、これらのいずれかによりアイコンが既に設定されていても、同様にこれらの関数を利用して別のアイコンに切り換えることができる。

gtk.StatusIconの子クラスに画像データを保持してみる

上記関数群の内set_from_pixmap()以外は、外部ファイルを参照してデータを読み込んでからアイコンを変更する。しかし、アイコンのデータは最初に一度だけ読み込んで保持しておけば十分と言えるので、システムトレイアイコンのクラスgtk.StatusIconの子クラスにその画像データ(Pixbuf)を保持し、メンバ関数の中でそのデータを用いてset_from_pixmap()によりアイコンを切り替えるようにしてみた。
下のクラス例では同時にツールチップ*1の文字列も変更している。

class StatusIconWithPixbuf(gtk.StatusIcon):
  """
  アイコンのPixbufを保持したステータスアイコン (PyGTK 2.10以上)
  """
  def __init__(self):
    gtk.StatusIcon.__init__(self)  # 必須
    # 各アイコン画像を一度だけ読んでデータを保持する
    self.icon_play = gtk.gdk.pixbuf_new_from_file(os.path.dirname(__file__) + "/icon1.xpm")
    self.icon_stop = gtk.gdk.pixbuf_new_from_file(os.path.dirname(__file__) + "/icon2.xpm")
    # 起動直後は停止の状態にする
    self.change_icon_state(False)
  def change_icon_state(self, act):
    """
    ステータスアイコンのアイコン画像とツールチップを切り替え
    引数actはTrue(動作時)かFalse(停止時)を指定する
    """
    if act == True:
      self.set_from_pixbuf(self.icon_play)
      self.set_tooltip("Started")
    else:
      self.set_from_pixbuf(self.icon_stop)
      self.set_tooltip("Stopped")

全体のコード例とテスト用画像は後半に貼り付ける。

関連記事:

参考URL:

使用したバージョン:

*1:マウスポインタをアイコンの上に止めたときに出る説明