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秒後に自動的に消すようにした
関連記事:
- PyGTKとGladeについて
- PyGTK + Gladeの簡単な例
- PyGTK + Gladeのアプリケーションにおけるハンドラ関数について(前半)
- PyGTK + Gladeのアプリケーションにおけるハンドラ関数について(後半)
参考URL: