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

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

PyGTKでステータスバーに文字列を表示する

GUIアプリケーションのステータスバーには色々なところから表示の要求が起こり得る。例えば、メニューの項目に対するヘルプ*1と、アプリケーション内での処理の状態など、同時に複数の系統からメッセージを表示させることが考えられる。
GTK+では、それぞれの系統にコンテキストIDという識別子を設けて、独立してメッセージの追加と削除が行える。先ほどの例では、アプリケーション内での処理によるメッセージが何か表示されているときに、メニュー項目のヘルプとして文字列を表示するということができる。このとき、メニュー項目から選択を外すと、直前に表示されていた(処理の)メッセージに戻る。
例として、「PyGTK + Gladeの簡単な例」のスクリプトをもとにしたコードを貼り付ける。この例では、ボタンクリックでステータスバーにメッセージ「button1 clicked」を出してからメニューの「終了」にマウスポインタを乗せると「Quit」になるが、選択を外すと「button1 clicked」に戻る。ただし、クリック時のメッセージは5秒で消えるようにしているので、それ以内に確かめる必要がある。

#! /usr/bin/python
# -*- encoding: utf-8 -*-

import os
try:
  import pygtk
  pygtk.require("2.0")
except:
  pass
try:
  import gtk
  import gtk.glade
  import gobject
except:
  sys.exit(1)


class PyGTKGladeTest:
  def __init__(self):
    gladefile = os.path.dirname(__file__) + "/pygtkgladetest.glade"
    xml = gtk.glade.XML(gladefile)
    xml.signal_autoconnect(self)
    signal_dic = { "gtk_main_quit" : gtk.main_quit }
    xml.signal_autoconnect(signal_dic)
    self.window = xml.get_widget("window1")
    # ステータスバーのウィジェット
    self.statusbar = xml.get_widget("statusbar1")
    # ステータスバーの初期化(コンテキストIDの発行)
    self.cxtid_menu   = self.statusbar.get_context_id("menu")
    self.cxtid_status = self.statusbar.get_context_id("status")
    self.window.show_all()
  def pop_statusbar_status(self):
    self.statusbar.pop(self.cxtid_status)
    # Trueを返すと時間ごとに繰り返し実行される ここでは1回だけなのでFalse
    return False
  def on_button1_clicked(self, widget):
    """ ボタンが押されたときの処理 """
    self.statusbar.push(self.cxtid_status, "button1 clicked")
    gobject.timeout_add(5000, self.pop_statusbar_status)
  def on_imagemenuitem1_select(self, widget):
    """ ステータスバーに文字列を追加して表示 """
    self.statusbar.push(self.cxtid_menu, "Quit")
  def on_imagemenuitem1_deselect(self, widget):
    """ ステータスバーに前回追加された文字列を消す """
    self.statusbar.pop(self.cxtid_menu)
  def main(self):
    gtk.main()

if __name__ == "__main__":
  app = PyGTKGladeTest()
  app.main()

以下、覚え書き。

  • 初期化時にGtkStatusbarウィジェットのオブジェクト(gtk.Statusbar)のメンバ関数get_context_id()でコンテキストIDをそれぞれ発行
  • 同オブジェクトのメンバ関数push()でメッセージを追加、pop()で削除。名前からも分かるが、データを下から積み上げて上から取り出す「スタック」と呼ばれるデータ構造で扱う。更に、引数にコンテキストIDを指定されることからも分かるが、IDごとに独立して扱う形
  • gobject.timeout_add()を使用して、表示したメッセージを5秒後に自動的に消すようにした

関連記事:

参考URL:

*1:マウスポインタを乗せたり、キーボードでたどったりしたときに説明を表示するもの