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