PyGTK + Gladeの簡単な例
「PyGTKとGladeについて」では実際のコードを扱わなかったため、ここでgladeファイルを用いたPyGTKの基本的な例を貼り付ける。
gladeファイル
ファイル名: pygtkgladetest.glade
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd"> <glade-interface> <widget class="GtkWindow" id="window1"> <property name="width_request">320</property> <property name="height_request">200</property> <signal name="delete_event" handler="gtk_main_quit"/> <child> <widget class="GtkVBox" id="vbox1"> <property name="visible">True</property> <child> <widget class="GtkMenuBar" id="menubar1"> <property name="visible">True</property> <child> <widget class="GtkMenuItem" id="menuitem1"> <property name="visible">True</property> <property name="label" translatable="yes">_File</property> <property name="use_underline">True</property> <child> <widget class="GtkMenu" id="menu1"> <property name="visible">True</property> <child> <widget class="GtkImageMenuItem" id="imagemenuitem1"> <property name="visible">True</property> <property name="label" translatable="yes">gtk-quit</property> <property name="use_underline">True</property> <property name="use_stock">True</property> <signal name="select" handler="on_imagemenuitem1_select"/> <signal name="deselect" handler="on_imagemenuitem1_deselect"/> <signal name="activate" handler="gtk_main_quit"/> </widget> </child> </widget> </child> </widget> </child> </widget> <packing> <property name="expand">False</property> </packing> </child> <child> <widget class="GtkButton" id="button1"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="label" translatable="yes">Test</property> <property name="response_id">0</property> <signal name="clicked" handler="on_button1_clicked"/> </widget> <packing> <property name="position">1</property> </packing> </child> <child> <widget class="GtkStatusbar" id="statusbar1"> <property name="visible">True</property> <property name="spacing">2</property> </widget> <packing> <property name="expand">False</property> <property name="position">2</property> </packing> </child> </widget> </child> </widget> </glade-interface>
以下はこのgladeファイルのメモ。
- メインウィンドウがウィンドウマネージャの「閉じる」により閉じられた場合にそこでアプリケーションを終了させる目的で「delete_event」に「gtk_main_quit」を関連付けている(これをしないと、ウィンドウが閉じられてもアプリケーションが動作し続けてしまう)。ただし、C言語と違い、gtk.main_quit()*1を呼ぶようにしなくてはならないため、このままでは機能しない
- メニュー項目にマウスポインタを乗せたりキーボードで選択したりしたときに「select」、選択が外れたときに「deselect」というシグナルが送られる
- ボタンがクリックされたときには「clicked」シグナルが送られる
- ウィンドウの最小サイズは、ウィジェットのプロパティにある「共通」タブにて要求する幅/高さを変更して指定する
Pythonのコード
上のファイルと同じディレクトリに下のPythonのコードを保存し、端末上で実行する。
ファイル名: pygtkgladetest.py
#! /usr/bin/python # -*- encoding: utf-8 -*- import sys import os try: import pygtk pygtk.require("2.0") except: pass try: import gtk import gtk.glade except: sys.exit(1) class PyGTKGladeTest: """ テスト """ def __init__(self): """ 初期化処理 """ # gladeファイル(同じディレクトリのpygtkgladetest.glade)を読み込む gladefile = os.path.dirname(__file__) + "/pygtkgladetest.glade" xml = gtk.glade.XML(gladefile) # gladeファイルで定義されているシグナルを自動で接続 xml.signal_autoconnect(self) # ハンドラ「gtk_main_quit」は別途「gtk.main_quit()」に設定 signal_dic = { "gtk_main_quit" : gtk.main_quit } xml.signal_autoconnect(signal_dic) # 個別のウィジェットをXMLから取り出す self.window = xml.get_widget("window1") # 表示 self.window.show_all() def on_button1_clicked(self, widget): """ ボタンが押されたときの処理 """ print "on_button1_clicked" def on_imagemenuitem1_select(self, widget): """ メニュー項目が選択されたときの処理 """ print "on_imagemenuitem1_select" def on_imagemenuitem1_deselect(self, widget): """ メニュー項目が選択解除されたときの処理 """ print "on_imagemenuitem1_deselect" def main(self): """ GTK+のメインループを呼ぶ """ gtk.main() if __name__ == "__main__": app = PyGTKGladeTest() app.main()
ボタンを押したりメニュー項目の選択/選択解除を行ったりすると、端末にメッセージが出力される。
以下はこのpyファイルのメモ。
- モジュール読み込み部分では「pygtk」「gtk」の他、gladeファイルを使用する場合には「gtk.glade」をインポートする
- signal_autoconnect(self)ではgladeファイル内で設定されたシグナルの接続を行っている
- signal_autoconnect(signal_dic)では辞書による追加のシグナル接続を行っている。これは、gladeファイル内で「gtk_main_quit」というハンドラ名を指定したところに対してgtk.main_quit()を関連付けるために実行したもの
- get_widget([ウィジェット名文字列])では、Gladeで付けたウィジェット名を指定することで、そのウィジェットのオブジェクトを取得している
- show_all()では、ウィンドウを示すオブジェクトに対して、子ウィジェットを含めた表示を行っている。show()の場合、ウィジェット1つに対して表示を行う。逆に、隠すにはhide_all()やhide()を使用する
関連記事:
- PyGTKとGladeについて
- PyGTKのプログラム実行時のバージョン判定について
- PyGTK + Gladeのアプリケーションにおけるハンドラ関数について(前半)
- PyGTK + Gladeのアプリケーションにおけるハンドラ関数について(後半)
- GtkBuilderとGladeについてと、PyGTK上での使用について(概要)
- GtkBuilderとGladeについてと、PyGTK上での使用について(実際のコード・前半)
- GtkBuilderとGladeについてと、PyGTK上での使用について(実際のコード・後半)
- PyGTKの簡単な例をPythonのコードのみで書く
- PyGTKでGtkBuilderをレイアウトに用いながらGUI部品のクラスを継承
参考URL:
使用したバージョン:
- PyGTK 2.12.0
- Glade 3.4.4
*1:アプリケーション内部のループを抜けて、アプリケーションを終了する