このページでは tkinter におけるラジオボタン(Radiobutton
クラス)の使い方について解説していきたいと思います。
ラジオボタンとは
ラジオボタンは下の図のようなボタンになります。おそらく今までに見たことのある人も多いと思います。
このラジオボタンは、複数のボタンから “1つのボタンのみ” をユーザーに選択させたい時に利用します。
tkinter 利用の主な目的は GUI アプリを作成することですので、ラジオボタンはアプリの設定を “複数の選択肢から1つのみユーザーに選択させたい時” に利用するケースが一番多いと思います。
例えばお絵描きアプリなどで、ペンの色を “赤色”・”緑色”・”青色” の3つの選択肢から1つを選択させるような場合のラジオボタンの構成は下の図のようになります。
ただし、ユーザーにラジオボタンを選択させるだけではラジオボタンを用意する意味がありません。
アプリが何らかの処理を行う際にどのラジオボタンが選択されているかを判別し、その選択されているラジオボタンに応じて処理内容を切り替えるようにプログラミングすることで、初めてユーザーの選択を反映するアプリに仕立てることができます。
ラジオボタンの使い方
では、このラジオボタンの使い方について解説していきたいと思います。
tkinter でラジオボタンを使う際に行うことは大きく分けて下記の3つになります。
- ラジオボタンウィジェットの作成
- ラジオボタンのグループ化
- 選択中のラジオボタンの判別
これらの3つについて、ここから解説していきたいと思います。
スポンサーリンク
ラジオボタンウィジェットの作成
ラジオボタンは、tkinter の Radiobutton
クラスのコンストラクタを実行することで作成することができます。
radio = tkinter.Radiobutton()
前述の通り、ラジオボタンは複数のボタンの中から1つのみを選択させるものです。一方で、tkinter のラジオボタンウィジェットは下の図のような1つのボタンのみになります。
つまり、元々は tkinter のラジオボタンウィジェットはそれぞれで独立した存在になっています。なので、複数のラジオボタンウィジェットを単に作成しただけだと、1つだけでなく全てのボタンを選択することができてしまい、本来のラジオボタンの機能を果たしてくれません。
複数のラジオボタンウィジェットから1つのみを選択できるようにするためには、そのための設定が別途必要です。
スポンサーリンク
ラジオボタンのグループ化
続いてその設定方法について解説していきます。
ここからは、”その中から1つのボタンのみを選択できる複数のボタンの集まり” をグループと呼ばせていただきます。
ラジオボタンをグループ化することで、その中の1つのラジオボタンのみを選択可能となります。つまり、グループ内の各ラジオボタンは他のラジオボタンとは排他的に選択されることになります。
例えば、1つのラジオボタンが選択されている状態で他のラジオボタンを選択すると、元々選択していたラジオボタンの選択が外れます。
この複数のラジオボタンをグループ化する方法や、グループ化される仕組みについて解説していきます。
グループ化する方法
このラジオボタンのグループ化は、”ラジオボタンとウィジェット変数を連動させる” ことで実現することができます。
ウィジェット変数については下記ページで解説していますので、まだ知らない方はこちらを参考にしていただければと思います。
Tkinterの使い方:ウィジェット変数について解説【StringVar・BooleanVar・IntVar・DoubleVar】もっと具体的にいうと、同じグループにしたいラジオボタン作成時(Radiobutton
クラスのコンストラクタ実行時)に、下記のようにオプションを設定することでこれらのラジオボタンを同じグループのものとして扱うことができます。
variable
オプション:同じウィジェット変数を設定value
オプション:グループ内のラジオボタンそれぞれで “異なる値” を設定
このように設定することで、ラジオボタンとウィジェット変数が連動し、複数のラジオボタンを同じグループのものとして扱われるようになります。
グループ化される仕組み
どのように連動するかというと、まずユーザーにラジオボタンが選択されると、その選択されたラジオボタンの value
に指定した値が “variable
に指定したウィジェット変数” に設定されるようになります。
さらに、ラジオボタンは varialbe
に指定したウィジェット変数と連動し、このウィジェット変数に設定された値が value
に指定されているラジオボタンにチェックが付きます。
逆にウィジェット変数に設定された値と異なる値が value
に指定されているラジオボタンのチェックは外れます。
つまり、同じウィジェット変数を variable
に指定し、それぞれに異なる値を value
に指定しておけば、これらの複数のラジオボタンの中から1つのボタンのみが選択できるように、勝手にラジボタンとウィジェット変数が連動してくれるようになります。
このグループ化が行われる仕組みを理解しておくと、下記のように設定した場合にどのようにラジオボタンが動作するかが簡単に想像することができるようになります。
例えば複数のラジオボタンの value
に同じ値を指定した場合は、これらの中の1つでも選択されるとその他のラジオボタンについてもチェックが入ることになります。
これは、選択されたラジオボタンの value
の値が variable
で指定したウィジェット変数に設定され、さらに、この 値と同じ value
が指定されたラジオボタン全てにチェックが入るようにラジオボタンが動作するためです。
また、同様の理由から、variable
で指定したウィジェット変数に設定されている値が、グループ内の全てのラジオボタンの value
に指定した値と異なる場合は、どのラジオボタンも選択されていない状態になります(どのラジオボタンにもチェックが付かない)。
また、ラジオボタンの variable
に異なるウィジェット変数を設定した場合は、これらのラジオボタンは異なるグループのものとして扱われます。
異なるグループ間であれば、同じ value
を指定しても問題なく動作させることができます。
選択中のラジオボタンの判別
では、グループの中でどのボタンが選択されているかはどうやって判別すれば良いでしょうか?
次はここについて解説していきます。
前述の通り、ラジオボタンは選択された際に、そのラジオボタンの value
に指定されている値がウィジェット変数(variable
に指定したウィジェット変数)に設定されます。
したがって、そのウィジェット変数には、現在選択中のラジオボタンの value
の値が設定されていることになります。
さらに、ウィジェット変数では、get
メソッドを実行することで、現在設定されている値を取得することが可能です。
つまり、variable
に指定したウィジェット変数に get
を実行させることで、現在選択中のラジオボタンの value
を取得することができ、どのラジオボタンが選択されているかを判別することが可能です。
このように、ウィジェット変数から選択中のラジオボタンの value
が取得できるので、アプリの設定をラジオボタンで切り替えるような使い方をする際は value
にその設定そのものを指定しておくと便利です。
例えば次に紹介するお絵描きスクリプトでは、value
にペンの色名やペンの太さを表す数値を指定するようにしています。
ですので、いざ画面に絵を描画する際には、get
メソッドで色名と太さを取得し、この取得した値をキャンバスへの描画時に指定するようにしています。
スポンサーリンク
ラジオボタンウィジェットの利用例
ここまでの解説を踏まえたラジオボタンウィジェットの利用例は下記のスクリプトのようになります。
# -*- coding:utf-8 -*-
import tkinter
# マウスボタンが押されていているかどうかの判断用
press = False
def mouse_move_func(event):
global canvas
# 現在のマウスの位置
x = event.x
y = event.y
# マウスボタンが押されている時だけ円を描画
if press:
canvas.create_oval(
# ウィジェット変数からペンの太さを色を取得
x - px_v.get() / 2, y - px_v.get() / 2,
x + px_v.get() / 2, y + px_v.get() / 2,
fill=color_v.get(),
width=0
)
def mouse_click_func(event):
global press
# マウスボタンが押された
press = True
def mouse_release_func(event):
global press
# マウスボタンが離された
press = False
# アプリの作成
app = tkinter.Tk()
app.title(
"サンプルアプリ" # アプリのタイトル
)
# キャンバスの作成
canvas = tkinter.Canvas(
app, # キャンバスの作成先アプリ
width = 400, # キャンバスの横サイズ
height = 400, # キャンバスの縦サイズ
bg = "white" # キャンバスの色
)
# キャンバスの配置
canvas.pack()
# 線の太さ用のウィジェット変数を作成
px_v = tkinter.IntVar(value=10)
# 色用のウィジェット変数を作成
color_v = tkinter.StringVar(value="red")
# 線の太さの設定ラジオボタンの作成
px_radio_1 = tkinter.Radiobutton(
app,
text="10px",
value=10,
variable=px_v
)
px_radio_1.pack()
px_radio_2 = tkinter.Radiobutton(
app,
text="20px",
value=20,
variable=px_v
)
px_radio_2.pack()
px_radio_3 = tkinter.Radiobutton(
app,
text="30px",
value=30,
variable=px_v
)
px_radio_3.pack()
# 色の設定ラジオボタンの作成
color_radio_1 = tkinter.Radiobutton(
app,
text="赤色",
value="red",
variable=color_v
)
color_radio_1.pack()
color_radio_2 = tkinter.Radiobutton(
app,
text="緑色",
value="green",
variable=color_v
)
color_radio_2.pack()
image=tkinter.PhotoImage(
file='eye_cat.png'
)
color_radio_3 = tkinter.Radiobutton(
app,
text="青色",
value="blue",
variable=color_v
)
color_radio_3.pack()
# イベントの受付
app.bind(
"<Motion>", # 受付けるイベント
mouse_move_func # そのイベント時に実行する関数
)
app.bind(
"<ButtonPress>", # 受付けるイベント
mouse_click_func # そのイベント時に実行する関数
)
app.bind(
"<ButtonRelease>", # 受付けるイベント
mouse_release_func # そのイベント時に実行する関数
)
# アプリの待機
app.mainloop()
スクリプトのベースは下記ページの最後に紹介しているお絵描きアプリです。
PythonでTkinterを使ってめちゃくちゃ簡単にGUIアプリを作る上記ページで紹介しているお絵描きアプリに対し、下記の2つをラジオボタンで設定できるようにしています。
- ペンの太さ
- ペンの色
スクリプトを実行すると下の図のような画面のアプリが起動します。
ラジオボタンは6つ用意しており、上の3つと下の3つがそれぞれ同じグループに属するラジオボタンになります。
上の3つがペンの太さ設定用のラジオボタンで、
下の3つがペンの色設定用のラジオボタンになります。
それぞれのラジオボタンを選択してからキャンバス上をクリックしながらマウスを移動させることで、ラジオボタンで選択した設定でキャンバス上に絵を描画することができます。
ウィジェット変数の作成
ではスクリプトでどのような処理を行なっているのかについて解説していきたいと思います。
まずは前準備としてウィジェット変数を作成します。
上記のように2つの項目(ペンの太さ・ペンの色)をラジオボタンで設定できるように、ウィジェット変数は2つ作成しています。
# 線の太さ用のウィジェット変数を作成
px_v = tkinter.IntVar(value=10)
# 色用のウィジェット変数を作成
color_v = tkinter.StringVar(value="red")
px_v
がペンの太さ設定用のラジオボタンの variable
に設定するウィジェット変数で、color_v
がペンの色設定用のラジオボタンの variable
に設定するウィジェット変数になります。
ウィジェット変数のコンストラクタに指定する value
はウィジェット変数の設定値の初期値になります。
そのためアプリ起動直後は、この初期値が value
に設定されているラジオボタンが選択された状態(チェックがついた状態)になります。
スポンサーリンク
ラジオボタンウィジェットの作成
ラジオボタンは前述の通り、Radiobutton
クラスのコンストラクタを実行することで作成することができます。
ラジオボタンの1つを作成しているのが下記部分になります。
# 線の太さの設定ラジオボタンの作成
px_radio_1 = tkinter.Radiobutton(
app,
text="10px",
value=10,
variable=px_v
)
px_radio_1.pack()
他のウィジェット同様に作成するだけでは画面上に表示されませんので、作成後に配置を行う必要があります。上記では pack
メソッドで配置を行なっています。
上記で作成する px_radio_1
に対応するラジオボタンがアプリの UI 上における下の図のボタンになります。
同様に Radiobutton
クラスのコンストラクタを実行し、それを配置することで合計6つのラジオボタンをアプリ上に作成しています。
スポンサーリンク
ラジオボタンのグループ化
さらに、コンストラクタ実行時には variable
と value
の指定を行なっています。
ペンの太さ設定用に作成する下記の3つのラジオボタンの variable
にはウィジェット変数 px_v
を指定しています。
px_radio_1
px_radio_2
px_radio_3
これらのラジオボタンの value
には、それぞれで異なるペンの太さを表す数値(整数)を指定しています。
このように設定することで、上記の3つのラジオボタンが同じグループのものとして扱われるようになります。
また、ペンの色設定用に作成する下記の3つのラジオボタンの variable
にはウィジェット変数 color_v
を指定しています。
color_radio_1
color_radio_2
color_radio_3
これらのラジオボタンの value
には、それぞれで異なるペンの色を表す色名(文字列)を指定しています。
このように設定することで、上記の3つのラジオボタンが同じグループのものとして扱われるようになります。
選択中のラジオボタンの判別
以上の設定により、ラジオボタンがアプリ上に表示され、ユーザーが同じグループのラジオボタンから1つのものを選択することができるようになります。
ただし、これだけだとユーザーがラジオボタンが選択できるだけでアプリの動作には反映されません。前述の通り、どのラジオボタンが選択されているかを判別し、その選択をアプリの動作に反映するようにスクリプトを記述する必要があります。
上記スクリプトにおいては、アプリの動作にユーザーの選択を反映させるために、マウス移動時に実行される mouse_move_func
関数の下記部分でウィジェット変数から選択中のラジオボタンに設定された value
の値を取得するようにしています。
canvas.create_oval(
# ウィジェット変数からペンの太さを色を取得
x - px_v.get() / 2, y - px_v.get() / 2,
x + px_v.get() / 2, y + px_v.get() / 2,
fill=color_v.get(),
width=0
)
create_oval
はキャンバス上に楕円を描画するメソッドで、第1引数と第2引数がその楕円の開始座標、第3引数と第4引数がその楕円の終了座標になります。
で、開始座標を (x
, y
) から px_v.get() // 2
を引いた値、終了座標を (x
, y
) に px_v.get() // 2
を足した値にしているので、要はマウス移動時には直径が px_v.get()
の円が描画されることになります。
そしてウィジェット変数 px_v.get()
では、下記の3つのラジオボタンの中の選択中のボタンに指定されている value
の値が取得されますので、この値が円の直径(ペンの太さ)として反映されることになります。
px_radio_1
px_radio_2
px_radio_3
さらに create_oval
の fill
は円の塗りつぶし色を指定するオプションになります。この fill
には color_v.get()
を指定していますので、下記の3つのラジオボタンの中の選択中のボタンに指定されている value
の値が円の塗りつぶし色として反映されることになります。
color_radio_1
color_radio_2
color_radio_3
そして、クリックしている状態でマウスを移動させると create_oval
が上記の設定で実行されるため、ラジオボタンで選択した太さや色のペンでキャンバス上に円が連続して描画され、お絵描きアプリのように振る舞うようになっています。
以上がラジオボタンウィジェットの基本的な使い方の例になります。ここまでの解説やスクリプトのように、ラジオボタンウィジェットを使う際には下記の3つを行う必要があります。
- ラジオボタンウィジェットの作成
- ラジオボタンのグループ化
- 選択中のラジオボタンの判別
さらにラジオボタンのグループ化を行うためには、下記を行う必要があります。
- ウィジェット変数の作成
基本的には、ラジオボタンを利用する際に重要なのはこれだけで、これらをしっかり理解しておけばラジオボタンの使い方には困らないかなぁと思います。
ここからは、このラジオボタンに対するオプションの詳細(Radiobutton
のコンストラクタ実行時に指定できるオプションの詳細)や、ラジオボタンに用意されたメソッドの紹介をしていきます。
ラジオボタンのオプション
続いてウィジェットの作成時(tkinter. Radiobutton()
実行時)や config
メソッド実行時に指定可能なラジオボタンウィジェットのオプションについて解説していきます。
指定可能なオプションの一覧は下記により表示することができます。
# radioはRadiobuttonのインスタンス
print(radio.keys())
また、ラジオボタンの右側の部分は「ラベル」です。このラベルに対するオプションは「ラベルウィジェット」と同様の動作をします。
具体的には、下記のオプションに関してはラベルウィジェットと同様の動作をすることを確認しています。
これらに関してはラベルウィジェットの解説時に紹介していますので、これらについて知りたい方は上記のリンクからラベルウィジェットの解説ページに飛んで解説を読んでいただければと思います。
ここでは上記以外で私が動作を理解しているものをピックアップして説明していきたいと思います(value
と variable
についてはここまでに解説してきましたので、ここでの解説は省略させていただきます)。
私の下記環境での実行結果をもとに説明していますが、環境によっては動きが異なるかもしれません
実際にご自身の環境で実行結果を確認していただくと、より確実に設定の効果を理解することができると思います
- OS:macOS Big Sur
- Python:3.8
- Tkinter:8.6
スポンサーリンク
command
command
はラジオボタン選択時に実行する関数を指定するオプションになります。
command
に関数名やメソッド名を指定することで、ラジオボタンが選択された際に、その関数やメソッドが自動的に実行されるようになります。
下記は command
オプションの指定例になります。ラジオボタンが選択された際に command
に指定した関数が実行され、キャンバスの背景色が変化するようになっています。
# -*- coding:utf-8 -*-
import tkinter
def change_bg():
canvas.config(
bg=color_v.get()
)
# アプリの作成
app = tkinter.Tk()
# キャンバスの作成
canvas = tkinter.Canvas(
app, # キャンバスの作成先アプリ
width=400, # キャンバスの横サイズ
height=400, # キャンバスの縦サイズ
)
# キャンバスの配置
canvas.pack()
# 色用のウィジェット変数を作成
color_v = tkinter.StringVar(value="red")
# 色の設定ラジオボタンの作成
color_radio_1 = tkinter.Radiobutton(
app,
text="赤色",
value="red",
variable=color_v,
command=change_bg # command
)
color_radio_1.pack()
color_radio_2 = tkinter.Radiobutton(
app,
text="緑色",
value="green",
variable=color_v,
command=change_bg # command
)
color_radio_2.pack()
color_radio_3 = tkinter.Radiobutton(
app,
text="青色",
value="blue",
variable=color_v,
command=change_bg # command
)
color_radio_3.pack()
# アプリの待機
app.mainloop()
command
で指定した関数はラジオボタンが選択されたタイミングで実行されることになります。したがって、ラジオボタンが選択された際に、”即座に” 何かしらの処理を行い時に便利なオプションになります。
text
・textvariable
text
や textvariable
はラジオボタンのラベルに表示する文字列を指定するオプションになります。
下記はラジオボタンのラベルに表示する文字列を "青色"
に指定する例になります。
radio = tkinter.Radiobutton(
app,
text="青色" # text
)
表示する文字列をウィジェット変数から取得したいような場合は、textvariable
オプションの方を指定します。textvariable
にはウィジェット変数オブジェクトを指定します。
bg
(or background
)
bg
(or background
)はラジオボタンの(通常時の)背景色を指定するオプションになります。
bg
(or background
)にはカラーコードや色名を指定します。
下記はラジオボタンの背景を "blue"
に指定する例になります。
radio = tkinter.Radiobutton(
app,
text="青色",
bg="blue", # bg
)
スポンサーリンク
state
state
はラジオボタンの状態を指定するオプションになります。
state
に指定可能なパラメータは下記の3つになります。
tkinter.ACTIVE
:アクティブ状態(?)tkinter.DISABLED
:無効状態(ボタンが選択不可)tkinter.NORMAL
:通常状態(ボタンが選択可)
ボタンをクリックした際にラジオボタンの状態は tkinter.ACTIVE
に変化するようですが、それによってどういう効果があるかは分かりませんでした…。
この state
の主な用途は、tkinter.DISABLED
や tkinter.NORMAL
を指定してボタンの選択不可とボタンの選択可とを切り替えることだと思います。
下記はラジオボタンの状態を tkinter.DISABLED
に指定する例になります。
radio = tkinter.Radiobutton(
app,
text="青色",
state=tkinter.DISABLED, # state
)
ボタンの状態が無効状態になるので、上記に設定して作成したラジオボタンは、アプリ起動直後は選択不可になります。
disabledforeground
disabledforeground
はラジオボタンが無効状態の時の文字の色を指定するオプションになります。
disabledforeground
にはカラーコードもしくは色名を指定します。
下記はラジオボタンが無効状態の時の文字の色を "white"
に指定する例です(ラジオボタンの状態も tkinter.DISABLED
に指定しています)。
radio = tkinter.Radiobutton(
app,
text="青色",
state=tkinter.DISABLED,
disabledforeground="white" # disabledforeground
)
takefocus
takefocus
はラジオボタンに対するフォーカスの有効無効を指定するオプションになります。
tkinter で作成するアプリでは、タブキー入力によりフォーカスを次の “フォーカスが有効な” ウィジェットに移動させることができます。
フォーカスが当てられているラジオボタンは、スペースキー入力することで選択することが可能です(チェックを入れることが可能)。
フォーカスが無効の場合は、タブキー入力時にフォーカスが当てられることはありません。
takefocus
に指定可能なパラメータは下記の2つになります。
1
:フォーカス有効(デフォルト)0
:フォーカス無効
下記はラジオボタンのフォーカスを無効に指定する例になります。
radio = tkinter.Radiobutton(
app,
text="青色",
takefocus=0, # takefocus
)
フォーカスの移動はウィジェットが2つ以上ないと分かりにくいので、動作を確認したい場合はラジオボタンを2つ以上作成・配置した状態で行うのが良いと思います。
スポンサーリンク
highlightcolor
・highlightthickness
highlightcolor
・highlightthickness
はフォーカスが当てられた時の囲い線の設定を指定するオプションになります。
highlightcolor
では囲い線の色をカラーコードや色名で指定します。
highlightthickness
では囲い線の太さをピクセル単位で指定します。が、私の環境では highlightthickness
を 3
以上に設定すると線が消えてしまいました(バグ?仕様?)。
また、他のウィジェットでは highlightbackground
を指定することでフォーカスが当てられていないときの線の色を指定することも可能だったのですが、このウィジェットでは highlightbackground
を指定してもウィジェットの見た目に変化はありませんでした…
下記はラジオボタンへのフォーカス時の囲い線の色を "red"
、囲い線の太さを 2
に指定する例になります。
radio = tkinter.Radiobutton(
app,
text="青色",
highlightcolor="red", # highlightcolor
highlightthickness=2 # highlightthickness
)
フォーカスの移動はウィジェットが2つ以上ないと分かりにくいので、動作を確認したい場合はラジオボタンを2つ以上作成・配置した状態で行うのが良いと思います。
bd
(or borderwidth
)
bd
(or borderwidth
)はラジオボタンの枠線の太さを指定するオプションになります。
bd
(or borderwidth
)はラジオボタンの枠線の太さをピクセル単位で指定します。
が、私の環境ではラジオボタンに対する枠線は表示されませんでした….。ただし線自体は存在するようで、他のウィジェットとの間隔が広がるようになりました。
また、次に説明する indicatoron=0
と bd
(or borderwidth
)を一緒に指定するとボタンの枠線の太さが変化することを確認しています。
indicatoron
indicatoron
はラジオボタンのインディケーター(左側の白丸)の ON/OFF を指定するオプションになります。
ラジオボタンでは通常左側に白丸が表示され、選択された場合はその白丸の中にさらに丸印が表示されるようになっています。
この左側の白丸を indicatoron=0
を指定することで消すことが可能です。
さらにこの際にはラジオボタンは通常のラジオボタンの見た目ではなく、単なるボタンの見た目に変化します。
ただし、見た目は変わりますが機能としてはラジオボタンと同じです。他のラジオボタンとグループ化することもできますし、選択されている時にグループ内の他のラジオボタンが選択された場合は、その選択が外れます。
また、選択されている状態では、ボタンが押されているときの見た目のままになります。
indicatoron
に指定可能なパラメータは下記の2つになります。
1
:インディケーター ON(デフォルト)0
:インディケーター OFF
下記はラジオボタンのインディケーターを OFF に指定する例になります。
radio = tkinter.Radiobutton(
app,
text="青色",
font=("", 40),
bd=10,
indicatoron=0, # indicatoron
)
上記のように設定したボタンは下の図のような見た目になります。
選択中は下の図のような見た目が保持されます。
スポンサーリンク
ラジオボタンのメソッド
次に、ラジオボタン特有の下記のメソッドについて解説していきたいと思います。
select
deselect
invoke
flash
メソッドも存在するようですが、すみません、このメソッドの動作については分かりませんでしたので説明は省略させていただきます…。
select
select
は実行したラジオボタンを選択するメソッドです。
非選択の状態でこのメソッドを実行すれば、メソッドを実行したラジオボタンが選択されます。選択された状態でメソッドを実行しても特に何も動作しません。
グループ化している場合、他のラジオボタンが選択中の状態でこのラジオボタンを実行すれば、そのラジオボタンの選択が外れ、メソッドを実行したラジオボタンのみが選択されます。
要は select
メソッドはマウスでラジオボタンでクリックした時と “ほぼ” 同様の動きをしてくれます。
異なるのは、select
メソッドを実行しても、ラジオボタンの command
に指定した関数・メソッドが実行されない点です。command
に指定した関数・メソッドの実行も含めて行いたい場合は次に説明する invoke
を利用します。
invoke
invoke
は実行したラジオボタンを選択し、さらに command
に指定した関数・メソッドを実行するメソッドです。
要は invoke
メソッドの実行により、マウスでラジオボタンをクリックした時と同じ動作をさせることができます。command
に指定した関数・メソッドを実行したくない場合は、前述の select
を利用します。
スポンサーリンク
deselect
deselect
は実行したラジオボタンから選択を外すメソッドです。
通常のマウス操作においては、初期状態以外はグループ内のラジオボタンの1つが必ず選択されている状態になります。ただし、この deselect
を実行することにより、グループ内のラジオボタンのどれも選択されていない状態にすることも可能です。
メソッドの利用例
各メソッドを利用したスクリプト例は下記のようになります。
# -*- coding:utf-8 -*-
import tkinter
def radio_select():
radio_1.select()
def radio_deselect():
radio_1.deselect()
def radio_invoke():
radio_1.invoke()
def print_radio_1():
print("ラジオボタン1が選択されました")
# アプリの作成
app = tkinter.Tk()
v = tkinter.IntVar(value=0)
radio_1 = tkinter.Radiobutton(
app,
text="ラジオボタン1",
variable=v,
value=1,
command=print_radio_1
)
radio_1.pack()
radio_2 = tkinter.Radiobutton(
app,
text="ラジオボタン2",
variable=v,
value=2,
)
radio_2.pack()
button_1 = tkinter.Button(
app,
text="ラジオボタン1をselect",
command=radio_select
)
button_1.pack()
button_2 = tkinter.Button(
app,
text="ラジオボタン1をdeselect",
command=radio_deselect
)
button_2.pack()
button_3 = tkinter.Button(
app,
text="ラジオボタン1をinvoke",
command=radio_invoke
)
button_3.pack()
# アプリの待機
app.mainloop()
このスクリプトでは下記の3つのボタンを用意しており、それぞれのボタンを押すことでラジオボタン1が各メソッドを実行するようになっています。
- ラジオボタン1をselect
- ラジオボタン1をdeselect
- ラジオボタン1をinvoke
各ボタンを押すことで、ラジオボタン1の選択・非選択が切り替わるところが確認できると思います。
またラジオボタン1の command
で指定している関数 print_radio_1
では、標準出力に “ラジオボタン1が選択されました” のメッセージを出力するようにしています。
select
実行時にはこのメッセージが表示されませんが、invoke
実行時にはこのメッセージが表示される、つまり invoke
実行時には command
で指定した関数が実行されているところも確認できると思います。
ラジオボタンとラベルフレームとの併用
最後にラジオボタンと相性の良いラベルフレームとの併用について解説していきたいと思います。
スポンサーリンク
ラベルフレームとの併用による効果
ラベルウィジェットとラベルフレームとを併用することで下記の2つの効果が得られます。
- どのラジオウィジェットが同じグループであるかが分かりやすくなる
- 何を設定するためのラジオボタンかが分かりやすくなる
どのラジオウィジェットが同じグループであるかが分かりやすくなる
ラジオボタンは単に作成・配置・グループ化しただけでは、どのラジオボタンが同じグループ化が分かりにくいです。
もちろんラジオボタンの選択を実際に行って、どのラジオボタン同士が排他的に選択されるかを確認すればどのラジオボタンがグループなのかは分かります。
ですが、見た目的にはどのラジオボタンが同じグループであるかが分からないので、それを確かめるためには実際にアプリを操作する必要があります。
この問題は、ラベルフレームとラジオボタンを併用することで解決することができます。ラベルフレームでは、下の図のようにラベルフレーム上に作成したウィジェットを囲う形で枠線が表示されます。
ですので、同じグループのラジオボタンを同じラベルフレーム上に作成することで、どのラジオボタンが同じグループであるかが一目でわかるようになります。
何を設定するためのラジオボタンかが分かりやすくなる
また、ラジオボタンは単に作成・配置・グループ化しただけでは、そのラジオボタンやグループが何を設定するためのものかが分かりにくいです。
もちろん各ラジオボタンのラベルで個別に説明するための文字列を表示するようにしても良いです。
ですが、ラベルフレームと併用した方が簡単に&簡潔にこの問題を解決することができます。
ラベルフレームは、ただのフレームとは異なり、フレームの枠線部分に見出しとなるラベルを設定することができます。
ですので、そのラベルに「何を設定するためのグループであるか」が分かるように「設定項目名」を表示してやれば、一目で何を設定するためのグループ・ラジオボタンであるかが分かるようになります。
ラベルフレームとの併用の仕方
ラジオボタンとラベルフレームとの併用は下記のように行います。
- ラベルフレームを作成・配置する
- ラベルフレームの
text
オプションに「設定項目名」を指定する
- ラベルフレームの
- ラベルフレーム上に同じグループの全てのラジオボタンを作成・配置する
ラベルフレームは LabelFrame
クラスのコンストラクタを実行することで作成することができます。ラベルフレームも他のウィジェット同様に作成後に配置を行う必要があります。
# appはメインウィンドウのインスタンス
frame = tkinter.LabelFrame(
app
)
また、LabelFrame
のコンストラクタには text
オプションを指定することが可能で、これを指定することでフレームにラベルを付けることができます。
# appはメインウィンドウのインスタンス
frame = tkinter.LabelFrame(
app,
text="ペンの色の設定"
)
ラベルフレーム上へのラジオボタンの作成・配置は、ラジオボタン作成時に Radiobutton
コンストラクタの第一引数にラベルフレームのインスタンスを指定することで実現することができます。
# frameはラベルフレームのインスタンス
frame = tkinter.Radiobutton(
frame, # 第1引数にラベルフレームのインスタンスを指定
# 略
)
さらに、作成したラジオボタンを pack
や grid
等で配置すれば、ラベルフレームの中にラジオボタンが配置されることになります。
複数のラジオボタンを同じラベルフレームの中にまとめて配置したい場合は、それらのラジオボタン作成時に同じラベルフレームのインスタンスを指定すれば良いです。
これにより、複数のラジオボタンが同じラベルフレームの中に配置されてどのラジオボタンが同じグループであるかが分かりやすくなります。
ただし、ラベルフレーム上にラジオボタンを作成することでグループ化されるのは見た目のみです。
機能的に “同じグループのラジオボタン” として動作させるためには(つまりこれらのラジオボタンで排他的に選択されるようにするためには)、別途前述で解説した value
と variable
の設定が必要なので注意してください。
ラジオボタンとラベルフレームとの併用例
ラジオボタンとラベルフレームと併用するようにしたスクリプト例が下記のようになります。
# -*- coding:utf-8 -*-
import tkinter
# アプリの作成
app = tkinter.Tk()
# ラベルフレームの作成
px_frame = tkinter.LabelFrame(
app,
text="ペンの太さの設定"
)
px_frame.pack(padx=30, pady=10)
color_frame = tkinter.LabelFrame(
app,
text="ペンの色の設定"
)
color_frame.pack(padx=30, pady=10)
# 線の太さ用のウィジェット変数を作成
px_v = tkinter.IntVar(value=10)
# 色用のウィジェット変数を作成
color_v = tkinter.StringVar(value="red")
# 線の太さの設定ラジオボタンの作成
px_radio_1 = tkinter.Radiobutton(
px_frame,
text="10px",
value=10,
variable=px_v,
)
px_radio_1.pack()
px_radio_2 = tkinter.Radiobutton(
px_frame,
text="20px",
value=20,
variable=px_v
)
px_radio_2.pack()
px_radio_3 = tkinter.Radiobutton(
px_frame,
text="30px",
value=30,
variable=px_v
)
px_radio_3.pack()
# 色の設定ラジオボタンの作成
color_radio_1 = tkinter.Radiobutton(
color_frame,
text="赤色",
value="red",
variable=color_v
)
color_radio_1.pack()
color_radio_2 = tkinter.Radiobutton(
color_frame,
text="緑色",
value="green",
variable=color_v
)
color_radio_2.pack()
color_radio_3 = tkinter.Radiobutton(
color_frame,
text="青色",
value="blue",
variable=color_v
)
color_radio_3.pack()
# アプリの待機
app.mainloop()
スクリプトを実行すると下の図のようなアプリが起動します。単にラベルフレームとラジオボタンを作成・配置するだけの例ですが、どのラジオボタンがグループであるかや、各ラジオボタンが何を設定するものであるかはラジオボタンウィジェットの利用例の時よりも分かりやすくなったことは確認できると思います。
スポンサーリンク
まとめ
このページでは tkinter における「ラジオボタンの使い方」について解説しました!
ラジオボタンはユーザに “複数の選択肢から1つのみ” を選択させたいような場合に活躍するウィジェットです。
ただし単に作成・配置するだけでは各ラジオボタンは独立して動作してしまうため、”複数の選択肢から1つのみ” を選択できるようにするために「グループ化」を行う必要がある点に注意が必要です。
このグループ化を行うためにはラジオボタン作成時に実行する Radiobutton
クラスのコンストラクタ実行時に variable
オプションと value
オプションを下記のように設定する必要があります。
variable
オプション:同じウィジェット変数を設定value
オプション:グループ内のラジオボタンそれぞれで “異なる値” を設定
また、ラジオボタンはラベルフレームとも相性が良く、併用することでどのようなラジオボタンであるかがユーザーに分かりやすくなります。
ユーザーから設定を受け付けるようなアプリ作成で活躍するウィジェットですので、是非使い方、特にグループ化についてしっかり理解しておきましょう!