Tkinterの使い方:ラジオボタン(Radiobutton)の使い方

tkinterのラジオボタンの使い方の解説ページアイキャッチ

このページでは 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 に指定したウィジェット変数” に設定されるようになります。

ラジオボタンとウィジェット変数が連動して選択されたラジオボタンのvalueがウィジェット変数に設定される様子

さらに、ラジオボタンは varialbe に指定したウィジェット変数と連動し、このウィジェット変数に設定された値が value に指定されているラジオボタンにチェックが付きます。

ラジオボタンとウィジェット変数が連動してウィジェット変数に設定されている値と同じ値をvalueに持つラジオボタンが選択される様子

逆にウィジェット変数に設定された値と異なる値が value に指定されているラジオボタンのチェックは外れます。

ラジオボタンとウィジェット変数が連動してウィジェット変数に設定されている値と同じ値をvalueに持たないラジオボタンの選択が外れる様子

つまり、同じウィジェット変数を variable に指定し、それぞれに異なる値を value に指定しておけば、これらの複数のラジオボタンの中から1つのボタンのみが選択できるように、勝手にラジボタンとウィジェット変数が連動してくれるようになります。

このグループ化が行われる仕組みを理解しておくと、下記のように設定した場合にどのようにラジオボタンが動作するかが簡単に想像することができるようになります。

例えば複数のラジオボタンの value に同じ値を指定した場合は、これらの中の1つでも選択されるとその他のラジオボタンについてもチェックが入ることになります。

これは、選択されたラジオボタンの value の値が variable で指定したウィジェット変数に設定され、さらに、この 値と同じ value が指定されたラジオボタン全てにチェックが入るようにラジオボタンが動作するためです。

複数のラジオボタンが同時に選択される様子

また、同様の理由から、variable で指定したウィジェット変数に設定されている値が、グループ内の全てのラジオボタンの value に指定した値と異なる場合は、どのラジオボタンも選択されていない状態になります(どのラジオボタンにもチェックが付かない)。

どのラジオボタンも選択されない様子

また、ラジオボタンの variable に異なるウィジェット変数を設定した場合は、これらのラジオボタンは異なるグループのものとして扱われます。

異なるグループ間であれば、同じ value を指定しても問題なく動作させることができます。

複数のグループのラジオボタンをアプリ上に作成する様子

選択中のラジオボタンの判別

では、グループの中でどのボタンが選択されているかはどうやって判別すれば良いでしょうか?

次はここについて解説していきます。

前述の通り、ラジオボタンは選択された際に、そのラジオボタンの value に指定されている値がウィジェット変数(variable に指定したウィジェット変数)に設定されます。

ラジオボタンとウィジェット変数が連動して選択されたラジオボタンのvalueがウィジェット変数に設定される様子

したがって、そのウィジェット変数には、現在選択中のラジオボタンの value の値が設定されていることになります。

さらに、ウィジェット変数では、get メソッドを実行することで、現在設定されている値を取得することが可能です。

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()

スクリプトのベースは下記ページの最後に紹介しているお絵描きアプリです。

tkinter解説ページのアイキャッtPythonで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 に設定されているラジオボタンが選択された状態(チェックがついた状態)になります。

ウィジェット変数作成時に指定した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 上における下の図のボタンになります。

px_radio_1に対応するラジオボタンウィジェット

同様に Radiobutton クラスのコンストラクタを実行し、それを配置することで合計6つのラジオボタンをアプリ上に作成しています。

スポンサーリンク

ラジオボタンのグループ化

さらに、コンストラクタ実行時には variablevalue の指定を行なっています。

ペンの太さ設定用に作成する下記の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 の値を取得するようにしています。

選択中のラジオボタンの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_ovalfill は円の塗りつぶし色を指定するオプションになります。この 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())

また、ラジオボタンの右側の部分は「ラベル」です。このラベルに対するオプションは「ラベルウィジェット」と同様の動作をします。

具体的には、下記のオプションに関してはラベルウィジェットと同様の動作をすることを確認しています。

これらに関してはラベルウィジェットの解説時に紹介していますので、これらについて知りたい方は上記のリンクからラベルウィジェットの解説ページに飛んで解説を読んでいただければと思います。

ここでは上記以外で私が動作を理解しているものをピックアップして説明していきたいと思います(valuevariable についてはここまでに解説してきましたので、ここでの解説は省略させていただきます)。

MEMO

私の下記環境での実行結果をもとに説明していますが、環境によっては動きが異なるかもしれません

実際にご自身の環境で実行結果を確認していただくと、より確実に設定の効果を理解することができると思います

  • OS:macOS Big Sur
  • Python:3.8
  • Tkinter:8.6

スポンサーリンク

command

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 で指定した関数はラジオボタンが選択されたタイミングで実行されることになります。したがって、ラジオボタンが選択された際に、”即座に” 何かしらの処理を行い時に便利なオプションになります。

texttextvariable

texttextvariable はラジオボタンのラベルに表示する文字列を指定するオプションになります。

textオプションの説明図

下記はラジオボタンのラベルに表示する文字列を "青色" に指定する例になります。

textの指定例
radio = tkinter.Radiobutton(
	app,
	text="青色" # text
)

表示する文字列をウィジェット変数から取得したいような場合は、textvariable オプションの方を指定します。textvariable にはウィジェット変数オブジェクトを指定します。

bg(or background

bg(or background)はラジオボタンの(通常時の)背景色を指定するオプションになります。

bgオプションの説明図

bg(or background)にはカラーコードや色名を指定します。

下記はラジオボタンの背景を "blue" に指定する例になります。

bgの指定例
radio = tkinter.Radiobutton(
	app,
	text="青色",
	bg="blue", # bg
)

スポンサーリンク

state

state はラジオボタンの状態を指定するオプションになります。

state に指定可能なパラメータは下記の3つになります。

  • tkinter.ACTIVE:アクティブ状態(?)
  • tkinter.DISABLED:無効状態(ボタンが選択不可)
  • tkinter.NORMAL:通常状態(ボタンが選択可)

ボタンをクリックした際にラジオボタンの状態は tkinter.ACTIVE に変化するようですが、それによってどういう効果があるかは分かりませんでした…。

この state の主な用途は、tkinter.DISABLEDtkinter.NORMAL を指定してボタンの選択不可とボタンの選択可とを切り替えることだと思います。

下記はラジオボタンの状態を tkinter.DISABLED に指定する例になります。

stateの指定例
radio = tkinter.Radiobutton(
	app,
	text="青色",
	state=tkinter.DISABLED, # state
)

ボタンの状態が無効状態になるので、上記に設定して作成したラジオボタンは、アプリ起動直後は選択不可になります。

disabledforeground

disabledforeground はラジオボタンが無効状態の時の文字の色を指定するオプションになります。

disabledforeground にはカラーコードもしくは色名を指定します。

下記はラジオボタンが無効状態の時の文字の色を "white" に指定する例です(ラジオボタンの状態も tkinter.DISABLED に指定しています)。

disabledforegroundの指定例
radio = tkinter.Radiobutton(
	app,
	text="青色",
	state=tkinter.DISABLED,
	disabledforeground="white" # disabledforeground
)

takefocus

takefocus はラジオボタンに対するフォーカスの有効無効を指定するオプションになります。

tkinter で作成するアプリでは、タブキー入力によりフォーカスを次の “フォーカスが有効な” ウィジェットに移動させることができます。

ウィジェットへのフォーカスが移動する様子

フォーカスが当てられているラジオボタンは、スペースキー入力することで選択することが可能です(チェックを入れることが可能)。

フォーカスが無効の場合は、タブキー入力時にフォーカスが当てられることはありません。

takefocus に指定可能なパラメータは下記の2つになります。

  • 1:フォーカス有効(デフォルト)
  • 0:フォーカス無効

下記はラジオボタンのフォーカスを無効に指定する例になります。

takefocusの指定例
radio = tkinter.Radiobutton(
	app,
	text="青色",
	takefocus=0, # takefocus
)

フォーカスの移動はウィジェットが2つ以上ないと分かりにくいので、動作を確認したい場合はラジオボタンを2つ以上作成・配置した状態で行うのが良いと思います。

スポンサーリンク

highlightcolorhighlightthickness

highlightcolorhighlightthickness はフォーカスが当てられた時の囲い線の設定を指定するオプションになります。

highlightcolor では囲い線の色をカラーコードや色名で指定します。

highlightthickness では囲い線の太さをピクセル単位で指定します。が、私の環境では highlightthickness3 以上に設定すると線が消えてしまいました(バグ?仕様?)。

MEMO

また、他のウィジェットでは highlightbackground を指定することでフォーカスが当てられていないときの線の色を指定することも可能だったのですが、このウィジェットでは highlightbackground を指定してもウィジェットの見た目に変化はありませんでした…

下記はラジオボタンへのフォーカス時の囲い線の色を "red"、囲い線の太さを 2 に指定する例になります。

highlight関連の指定例
radio = tkinter.Radiobutton(
	app,
	text="青色",
	highlightcolor="red", # highlightcolor
	highlightthickness=2 # highlightthickness
)

フォーカスの移動はウィジェットが2つ以上ないと分かりにくいので、動作を確認したい場合はラジオボタンを2つ以上作成・配置した状態で行うのが良いと思います。

bd(or borderwidth

bd(or borderwidth)はラジオボタンの枠線の太さを指定するオプションになります。

bd(or borderwidth)はラジオボタンの枠線の太さをピクセル単位で指定します。

が、私の環境ではラジオボタンに対する枠線は表示されませんでした….。ただし線自体は存在するようで、他のウィジェットとの間隔が広がるようになりました。

また、次に説明する indicatoron=0bd(or borderwidth)を一緒に指定するとボタンの枠線の太さが変化することを確認しています。

indicatoron

indicatoron はラジオボタンのインディケーター(左側の白丸)の ON/OFF を指定するオプションになります。

ラジオボタンでは通常左側に白丸が表示され、選択された場合はその白丸の中にさらに丸印が表示されるようになっています。

この左側の白丸を indicatoron=0 を指定することで消すことが可能です。

さらにこの際にはラジオボタンは通常のラジオボタンの見た目ではなく、単なるボタンの見た目に変化します。

indicatoronオプションの説明図

ただし、見た目は変わりますが機能としてはラジオボタンと同じです。他のラジオボタンとグループ化することもできますし、選択されている時にグループ内の他のラジオボタンが選択された場合は、その選択が外れます。

また、選択されている状態では、ボタンが押されているときの見た目のままになります。

indicatoron に指定可能なパラメータは下記の2つになります。

  • 1:インディケーター ON(デフォルト)
  • 0:インディケーター OFF

下記はラジオボタンのインディケーターを OFF に指定する例になります。

indicatoronの指定例
radio = tkinter.Radiobutton(
	app,
	text="青色",
	font=("", 40),
	bd=10,
	indicatoron=0, # indicatoron
)

上記のように設定したボタンは下の図のような見た目になります。

indicatoron=0の時のラジオボタンの見た目1

選択中は下の図のような見た目が保持されます。

indicatoron=0の時のラジオボタンの見た目2

スポンサーリンク

ラジオボタンのメソッド

次に、ラジオボタン特有の下記のメソッドについて解説していきたいと思います。

  • 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引数にラベルフレームのインスタンスを指定
	# 略
)

さらに、作成したラジオボタンを packgrid 等で配置すれば、ラベルフレームの中にラジオボタンが配置されることになります。

複数のラジオボタンを同じラベルフレームの中にまとめて配置したい場合は、それらのラジオボタン作成時に同じラベルフレームのインスタンスを指定すれば良いです。

これにより、複数のラジオボタンが同じラベルフレームの中に配置されてどのラジオボタンが同じグループであるかが分かりやすくなります。

ただし、ラベルフレーム上にラジオボタンを作成することでグループ化されるのは見た目のみです。

機能的に “同じグループのラジオボタン” として動作させるためには(つまりこれらのラジオボタンで排他的に選択されるようにするためには)、別途前述で解説した valuevariable の設定が必要なので注意してください。

ラジオボタンとラベルフレームとの併用例

ラジオボタンとラベルフレームと併用するようにしたスクリプト例が下記のようになります。

ラジオボタンとラベルフレームとの併用
# -*- 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 オプション:グループ内のラジオボタンそれぞれで “異なる値” を設定

また、ラジオボタンはラベルフレームとも相性が良く、併用することでどのようなラジオボタンであるかがユーザーに分かりやすくなります。

ユーザーから設定を受け付けるようなアプリ作成で活躍するウィジェットですので、是非使い方、特にグループ化についてしっかり理解しておきましょう!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です