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

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

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()を使用する

関連記事:

参考URL:

使用したバージョン:

  • PyGTK 2.12.0
  • Glade 3.4.4

*1:アプリケーション内部のループを抜けて、アプリケーションを終了する