pygtkで遊ぼう(5) gtk.CheckButton、gtk.RadioButton編

さて、今回はpygtkでチェックボックスラジオボタンを作ってウインドウ上に配置してみようと思います。

ということで、いきなりですが、ソースコードは以下のようになります。
今回も「pygtkで遊ぼう」シリーズの最初に作ったWindowサンプルにチェックボックスラジオボタンの作成処理を追加しました。

#!/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)

        hbox = gtk.HBox()
        hbox.pack_start(self.construct_checkbox_group())
        hbox.pack_start(self.construct_radio_group())
        self.window.add(hbox)
        self.window.show_all()
        gtk.main()

    ##
    def construct_checkbox_group(self):
        vbox = gtk.VBox()
                
        check = gtk.CheckButton('Check 1')
        check.connect('toggled', self.on_toggle_check_1)
        vbox.pack_start(check)

        check = gtk.CheckButton('Check 2')
        check.connect('toggled', self.on_toggle_check_2)
        vbox.pack_start(check)

        check = gtk.CheckButton('Check 3')
        check.connect('toggled', self.on_toggle_check_3)
        vbox.pack_start(check)
        
        checkFrm = gtk.Frame('Check Buttons')
        checkFrm.add(vbox)

        return checkFrm

    ##
    def construct_radio_group(self):
        vbox = gtk.VBox()
        
        radio = gtk.RadioButton(None, 'Radio 1')
        radio.connect('toggled', self.on_toggle_radio_1)
        vbox.pack_start(radio)

        radio = gtk.RadioButton(radio, 'Radio 2')
        radio.connect('toggled', self.on_toggle_radio_2)
        vbox.pack_start(radio)

        radio = gtk.RadioButton(radio, 'Radio 3')
        radio.connect('toggled', self.on_toggle_radio_3)
        vbox.pack_start(radio)

        frame = gtk.Frame('Radio Buttons')
        frame.add(vbox)
        
        return frame
    
    ##
    def on_toggle_check_1(self, widget=None, data=None):
        if widget.get_active():
            print 'check 1 is ON'
        else:
            print 'check 1 is OFF'

    ##
    def on_toggle_check_2(self, widget=None, data=None):
        if widget.get_active():
            print 'check 2 is ON'
        else:
            print 'check 2 is OFF'

    ##
    def on_toggle_check_3(self, widget=None, data=None):
        if widget.get_active():
            print 'check 3 is ON'
        else:
            print 'check 3 is OFF'

    ##
    def on_toggle_radio_1(self, widget=None, data=None):
        if widget.get_active():
            print 'radio 1 is ON'
        else:
            print 'radio 1 is OFF'

    ##
    def on_toggle_radio_2(self, widget=None, data=None):
        if widget.get_active():
            print 'radio 2 is ON'
        else:
            print 'radio 2 is OFF'

    ##
    def on_toggle_radio_3(self, widget=None, data=None):
        if widget.get_active():
            print 'radio 3 is ON'
        else:
            print 'radio 3 is OFF'

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

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

で、上記のスクリプトを実行すると、こんな感じになります。


クラス階層

gtk.CheckButtonは先日紹介したgtk.Buttonの機能やシグナルを継承しています。
もう少し正確にいうと、

  • gtk.Button
    • gtk.ToggleButton
      • gtk.CheckButton

(インデントが深いほうがサブクラス)

となっています。

一方、gtk.RadioButtonのほうは、

  • gtk.CheckButton
    • gtk.RadioButton

(インデントが深いほうがサブクラス)

という継承関係になっています。
詳細はpygtkのリファレンスマニュアルを参照してみてください。

今回のソースのうち、チェックボタン、ラジオボタンの作成についてのコードを上記のソースで赤文字にしました。以下でその部分に関して説明したいと思います。
on_toggle_****()という関数は、チェックボックスラジオボタンが押された場合にメッセージを表示するためのものなので、それらに関しての説明は省略します。

チェックボックスラジオボタンの配置

__init__(self)関数中の以下の部分で、チェックボックスラジオボタンをウインドウに配置しています。
ウインドウにチェックボックス用、ラジオボタン用の2つのフレームを横並びに配置したいので、
前回説明したgtk.HBox()を使用しています。

        hbox = gtk.HBox()
        hbox.pack_start(self.construct_checkbox_group())
        hbox.pack_start(self.construct_radio_group())

チェックボックスの作成

さて、まずはチェックボックスを作成する関数です。

    def construct_checkbox_group(self):
        vbox = gtk.VBox()
                
        check = gtk.CheckButton('Check 1')
        check.connect('toggled', self.on_toggle_check_1)
        vbox.pack_start(check)

        check = gtk.CheckButton('Check 2')
        check.connect('toggled', self.on_toggle_check_2)
        vbox.pack_start(check)

        check = gtk.CheckButton('Check 3')
        check.connect('toggled', self.on_toggle_check_3)
        vbox.pack_start(check)
        
        checkFrm = gtk.Frame('Check Buttons')
        checkFrm.add(vbox)

        return checkFrm

この関数は、フレーム(後で説明します。)の中にチェックボタンを3つ作成します。
フレームの中にチェックボタンを「3つ」追加するので、前回説明したgtk.VBox()を使います。

チェックボックス作成の書式は次の通りです。

書式 : gtk.CheckButton(label=None, use_underline=True)

  • label : チェックボックスに表示される文字列を指定
  • use_underline : Trueが指定されている場合、label文字列中にアンダースコアがあると、その次の文字がアクセラレータキーとして使えるようになります。(pygtk 2.4以上で有効)

use_underlineについて補足です。
今回のサンプルソースでは、'Check 1'などのようにラベル文字列中にアンダースコアがありませんよね。もし、'Check_1'となっていた場合には、以下のような感じでラベルが表示され、Altキーとアンダースコアの次の文字を入力することで、そのチェックボックスの切り替えを行うことができます。


ラジオボタンの作成

この関数は、フレーム(後で説明します。)の中にラジオボタンを3つ作成します。
チェックボックスの場合と同様に、ラジオボタンを「3つ」追加するので、前回説明したgtk.VBox()を使います。

    def construct_radio_group(self):
        vbox = gtk.VBox()
        
        radio = gtk.RadioButton(None, 'Radio 1')
        radio.connect('toggled', self.on_toggle_radio_1)
        vbox.pack_start(radio)

        radio = gtk.RadioButton(radio, 'Radio 2')
        radio.connect('toggled', self.on_toggle_radio_2)
        vbox.pack_start(radio)

        radio = gtk.RadioButton(radio, 'Radio 3')
        radio.connect('toggled', self.on_toggle_radio_3)
        vbox.pack_start(radio)

        frame = gtk.Frame('Radio Buttons')
        frame.add(vbox)
        
        return frame

ラジオボタン作成の書式は次の通り

書式 : gtk.CheckButton(group=None, label=None, use_underline=True)

  • group : ラジオボタンと同じグループに続する別のラジオボタンがあれば指定。
  • label : ラジオボタンに表示される文字列を指定
  • use_underline : Trueが指定されている場合、label文字列中にアンダースコアがあると、その次の文字がアクセラレータキーとして使えるようになります。(pygtk 2.4以上で有効)

引数の「group」について補足します。
今回のサンプルソースの場合、radio1, radio2, radio3のうちどれか1つだけが選択可能になっています。
radio1がONの時にradio2をクリックすると、radio2がONになってradio1がOFFになりすよね。
groupで指定したラジオボタンとは同じグループに続することになり、GTKがON,OFFの切替を行ってくれるようになります。

チェックボックスラジオボタンの状態

チェックボックスにチェックがついているのか、いないのか
ラジオボタンが選択されているのか、いないのか
を設定・取得するためのメソッドは次のようになっています。
(on_toggle_****()でも使用しています)

(1)状態の設定

書式 : def set_active(is_active)

  • is_active : Trueを指定すると選択状態に、Falseでその逆に。

(2)状態の取得

書式 : def get_active()

フレーム(gtk.Frame)について

見た目がどんな感じなのかは、上のスクリーンショットを見ていただければ一目瞭然ですね(笑
複数のウィジェットをグループ分けしたい時に便利です。
ただ単に視覚的にカテゴリ分けできる以外に、特別な機能はもっていません。

書式 : gtk.Frame(label=None)

  • label : フレームに表示する文字列

いや〜。。全然説明が上手になりませんね。。。ごめんなさい。
今回は長くなりそうだったので見送りましたが、次回こそプルダウンメニューの説明をしようと思います。

つづく。