pygtkであそぼう(2) gtk.Button編

前回は簡単な(というか単純な)Windowを表示させるスクリプトを書きました。
今回は、前回作ったWindowにボタンを1つ追加てみます。
(今回も単純すぎる内容ですが。。汗)

今回のソースコードはこんな感じになりました。

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

import sys
import pygtk
if sys.platform != 'win32':
    pygtk.require('2.0')
import gtk

#
#
class simpleWindow:
    ##
    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_border_width(40)
        self.window.set_size_request(400, 300)
        self.window.connect('delete_event', self.on_quit)

        self.btn = gtk.Button('Button Sample')
        self.btn.connect('activate', self.on_btn_activate)
        self.btn.connect('clicked', self.on_btn_clicked)
        self.btn.connect('enter', self.on_btn_enter)
        self.btn.connect('leave', self.on_btn_leave)
        self.btn.connect('pressed', self.on_btn_pressed)
        self.btn.connect('released', self.on_btn_released)
        self.window.add(self.btn)

        self.window.show_all()
        
        gtk.main()

    ##
    def on_btn_clicked(self, widget=None, data=None):
        print 'click'

    ##
    def on_btn_activate(self, widget=None, data=None):
        print 'activate'

    ##
    def on_btn_enter(self, widget=None, data=None):
        print 'enter'

    ##
    def on_btn_leave(self, widget=None, data=None):
        print 'leave'

    ##
    def on_btn_pressed(self, widget=None, data=None):
        print 'pressed'

    ##
    def on_btn_released(self, widget=None, data=None):
        print 'released'

    ##
    def on_quit(self, widget, event=None, data=None):
        print '-- quit --'
        gtk.main_quit()
        return False

#
#
def main():
    wind = simpleWindow()
    
#
#
if __name__ == '__main__':
    main()

ターミナルから実行すると、こんな感じになります。


。。。あまりのスカスカ具合に、もう少しましな例は。。。と思ったりしますが、ひとつご勘弁を。

それではソースの頭のほうから、赤い部分のソースについて説明していきます。

ボタンの生成

以下の1行でボタンウィジェットを生成しています。
ただ、この段階ではウインドウにのっかっていない状態です。

self.btn = gtk.Button('Button Sample')

ボタンのシグナルハンドラを登録

以下でボタンが操作されたりした場合に発生するシグナルを処理する関数を登録します。
これは前回のWindowの'delete_event'でやった場合と同じでconnect()を使用します。

self.btn.connect('activate', self.on_btn_activate)
self.btn.connect('clicked', self.on_btn_clicked)
self.btn.connect('enter', self.on_btn_enter)
self.btn.connect('leave', self.on_btn_leave)
self.btn.connect('pressed', self.on_btn_pressed)
self.btn.connect('released', self.on_btn_released)

現状のボタンウィジェットが発生させるシグナルは、上記の6種類です。

  • acvivate:(ボタンウィジェットの場合、clickedシグナルに置き換えられるので、このシグナルは発生しない)
  • clicked:ボタンがクリックされた場合に発生します(マウスボタンが話された時に発生)。
  • enter:マウスカーソルがボタンの領域に入った時に発生します。
  • leave:マウスカーソルがボタンの領域から出た時に発生します。
  • pressed:ボタンが押された場合に発生します。
  • released:ボタンが話された場合に発生します。

さて、ここで「はて?」と思った方、いい感じです。
clicked, pressed。。同じことでは。?と。
はい、同じです(笑。ただ、今回のスクリプトを実行して、ターミナルに表示される出力を見ていると、
どうやらclicked、pressedともにマウスボタンが離された時点で発生しています。
また、clicked→pressedの順で発生しているようです。

ボタンをウインドウに追加

このadd()を行うことで、ようやくボタンがウインドウの上にくっつきます。

self.window.add(self.btn)

ボタンのシグナルを処理する関数たち

以下の関数は、上記で説明したボタンのシグナルが発生した場合の処理を記述
するための関数です。今回の場合には、プリント文で文字列を出力しているだけです。

    ##
    def on_btn_clicked(self, widget=None, data=None):
        print 'click'

    ##
    def on_btn_activate(self, widget=None, data=None):
        print 'activate'

    ##
    def on_btn_enter(self, widget=None, data=None):
        print 'enter'

    ##
    def on_btn_leave(self, widget=None, data=None):
        print 'leave'

    ##
    def on_btn_pressed(self, widget=None, data=None):
        print 'pressed'

    ##
    def on_btn_released(self, widget=None, data=None):
        print 'released'

さてさて、だいたいGTKとの付き合い方がわかってきたと思います。
GTKウィジェットたちは、様々なタイミングでシグナルを発生させます。
そのシグナルを処理するための関数をGTKウィジェットに設定しておくことで、シグナル発生時にその処理が実行されるというしくみです。

どのウィジェットが、どんな種類のシグナルを発生させるかについては、前回ご紹介したpygtkのドキュメントに詳しくかかれていますのでいくつか見てみてください。

さて、最後に、今回のサンプルではウインドウに1つのボタンだけを追加しました。
では2つ以上のボタンを追加したい場合にはどうでしょうか。
ウインドウ上には1つのウィジェットしかadd()することができません。

困りましたね(笑。。ということで、次回はその打開策としてHBox, VBoxというウィジェットについて、説明をしようと思います。

つづく。