【Tkinter入門 第2回】対話的なアプリを作ろう!ユーザーの入力を受け付けるウィジェット (Entry, Radiobutton, Checkbutton)
「ボタンを押すだけじゃなくて、ユーザーに文字を入力してもらいたい!」
「GUIの入力欄と、Pythonの変数をどうやって連携させるの?」
「複数の選択肢から一つを選ばせるラジオボタンや、ON/OFFのチェックボックスってどうやって作るんだろう?」
こんにちは! Tkinter探検隊、隊長のPythonistaです! 前回の第1回では、Tkinterで最初のウィンドウを作成し、ラベルとボタンを配置し、ボタンがクリックされたら特定の処理を実行するという、GUIアプリの最も基本的な骨格を学びましたね。
シリーズ第2回の今回は、一方的に情報を表示するだけでなく、ユーザーからの入力を受け取ることで、アプリケーションを本当の意味で「対話的」にするためのウィジェットたちを特集します! 具体的には、
- 一行のテキストを入力するための
Entry
ウィジェット - 複数の選択肢から一つを選ぶ
Radiobutton
ウィジェット - ON/OFFを選択する
Checkbutton
ウィジェット - そして、GUIとPythonコードを繋ぐための超重要概念、Tkinterの制御変数 (
StringVar
など)
について、分かりやすく解説していきます。この回をマスターすれば、ユーザーの操作に応じて動的に変化する、本格的なアプリケーションの入力画面を作成できるようになりますよ!
1. 準備:モジュールのインポート
今回も、Tkinterをtk
としてインポートするところから始めましょう。また、よりモダンな見た目のウィジェットを使うために、tkinter.ttk
もインポートしておきます。
import tkinter as tk
from tkinter import ttk # Themed Tkinter ウィジェットを使うためにインポート
2.【最重要】GUIとコードを繋ぐ橋渡し:Tkinterの制御変数
テキスト入力ボックスなどのウィジェットを学ぶ前に、まず最も重要な概念を理解する必要があります。それは、「どうやってGUIウィジェット上の値(例: 入力された文字)を、Pythonのコードで取得するのか?」という問題です。
その答えが、Tkinterが提供する特別な変数、制御変数 (Control Variables) です。
StringVar()
: 文字列を扱うための制御変数。IntVar()
: 整数を扱うための制御変数。BooleanVar()
: 真偽値(True/False)を扱うための制御変数。
これらの変数は、ウィジェットとPythonコードの間を繋ぐ「橋」のような役割を果たします。ウィジェットにこの変数を関連付けると、
- ユーザーがGUIを操作(例: 文字を入力、チェックボックスをON)すると、関連付けられた制御変数の値が**自動的に更新**されます。
- 逆に、Pythonコード側で制御変数の値を変更すると、関連付けられたウィジェットの表示が**自動的に更新**されます。
値の取得には.get()
メソッド、値の設定には.set()
メソッドを使います。この仕組みを理解することが、インタラクティブなGUIアプリを作る上での鍵となります。
3. テキスト入力を受け付ける:Entry
ウィジェット
Entry
ウィジェットは、ユーザーが一行のテキストを入力するための、最も基本的な入力欄です。先ほどのStringVar
と組み合わせて使ってみましょう。
import tkinter as tk
def show_input_text():
# StringVarから.get()メソッドで現在の値を取得
user_name = name_var.get()
result_label.config(text=f"こんにちは、{user_name}さん!")
window = tk.Tk()
window.title("Entryウィジェットの例")
# 1. 文字列を扱うためのStringVarを作成
name_var = tk.StringVar()
# デフォルト値を設定することも可能
name_var.set("Pythonista")
# 2. Entryウィジェットを作成し、textvariableオプションでStringVarを関連付ける
name_entry = tk.Entry(window, textvariable=name_var, width=30, font=("Arial", 14))
name_entry.grid(row=0, column=0, padx=10, pady=10)
# 3. ボタンを作成し、commandに関数を指定
submit_button = tk.Button(window, text="挨拶する", command=show_input_text)
submit_button.grid(row=1, column=0, pady=5)
# 結果表示用ラベル
result_label = tk.Label(window, text="", font=("Arial", 14))
result_label.grid(row=2, column=0, pady=10)
window.mainloop()
この例では、入力欄の文字が変わるとname_var
の値が自動で更新され、ボタンを押すとshow_input_text
関数がname_var.get()
でその値を取得してラベルに表示しています。
4. 複数の選択肢から一つを選ぶ:Radiobutton
ウィジェット
ラジオボタンは、いくつかの選択肢の中から、一つだけをユーザーに選ばせたい場合に使います。
重要なポイントは、**一つのグループを構成する全てのラジオボタンで、同じ制御変数を共有する**ことです。そして、各ラジオボタンには異なるvalue
(そのボタンが選ばれた時に制御変数に設定される値)を指定します。
import tkinter as tk
from tkinter import ttk
def show_selected_choice():
result_label.config(text=f"選択されたのは「{choice_var.get()}」です。")
window = tk.Tk()
window.title("Radiobuttonの例")
# 選択肢を保持するためのStringVar
choice_var = tk.StringVar()
choice_var.set("Python") # 初期選択値を設定
label = tk.Label(window, text="好きなプログラミング言語は?")
label.pack(pady=5)
# ラジオボタンを作成 (全て同じ'choice_var'を共有)
radio1 = ttk.Radiobutton(window, text="Python", variable=choice_var, value="Python")
radio1.pack(anchor=tk.W, padx=20)
radio2 = ttk.Radiobutton(window, text="JavaScript", variable=choice_var, value="JavaScript")
radio2.pack(anchor=tk.W, padx=20)
radio3 = ttk.Radiobutton(window, text="Java", variable=choice_var, value="Java")
radio3.pack(anchor=tk.W, padx=20)
submit_button = ttk.Button(window, text="選択を決定", command=show_selected_choice)
submit_button.pack(pady=10)
result_label = tk.Label(window, text="")
result_label.pack(pady=5)
window.mainloop()
この例では、よりモダンな見た目のttk.Radiobutton
を使っています。.pack()
は.grid()
と並ぶもう一つのジオメトリマネージャで、ウィジェットを順番に詰め込んでいくシンプルな配置方法です。
5. ON/OFFの選択:Checkbutton
ウィジェット
チェックボックスは、「同意する」「オプションを有効にする」といったON/OFFの選択に使います。通常、IntVar
またはBooleanVar
と組み合わせて、チェックされている状態(ON)を1
またはTrue
、チェックされていない状態(OFF)を0
またはFalse
として扱います。
import tkinter as tk
from tkinter import ttk
def check_status():
if mail_flag.get():
print("メールマガジンの購読がONになっています。")
else:
print("メールマガジンの購読はOFFです。")
window = tk.Tk()
window.title("Checkbuttonの例")
# チェック状態を保持するためのBooleanVar
mail_flag = tk.BooleanVar()
mail_flag.set(True) # デフォルトでチェック状態に
check = ttk.Checkbutton(
window,
text="お得な情報満載のメールマガジンを購読する",
variable=mail_flag,
command=check_status # クリックするたびに関数が呼ばれる
)
check.pack(padx=20, pady=20)
window.mainloop()
この例では、チェックボックスの状態が変わるたびにcheck_status
関数が呼ばれ、現在の状態をコンソールに出力します。
6. モダンな選択肢:ttk.Combobox
(プルダウンメニュー)
選択肢が多い場合、ラジオボタンをたくさん並べるよりも、プルダウンメニュー(ドロップダウンリスト)の方が省スペースでスマートです。Tkinterでは、ttk
モジュールのCombobox
ウィジェットでこれを実現できます。
import tkinter as tk
from tkinter import ttk
window = tk.Tk()
window.title("Comboboxの例")
label = tk.Label(window, text="好きな月を選択してください:")
label.pack(pady=5)
# 選択肢のリスト
months = ['1月', '2月', '3月', '4月', '5月', '6月',
'7月', '8月', '9月', '10月', '11月', '12月']
# 選択値を保持するためのStringVar
selected_month = tk.StringVar()
combo = ttk.Combobox(
window,
textvariable=selected_month,
values=months,
state='readonly' # readonlyにすると、リスト以外の入力を禁止できる
)
combo.pack(pady=5)
combo.current(0) # 最初の選択肢 (0番目の'1月') をデフォルト表示に
def show_selection():
print(f"選択された月: {selected_month.get()}")
button = ttk.Button(window, text="決定", command=show_selection)
button.pack(pady=10)
window.mainloop()
ttk.Combobox
は、次回のプロジェクト「材料重量計算アプリ」で材料を選択するのにぴったりのウィジェットですね!
まとめと次回予告
今回は、Tkinterでユーザーからの入力を受け付けるための、様々なウィジェットとその使い方を学びました。
- GUIとPythonコードを繋ぐための**制御変数** (
StringVar
,IntVar
,BooleanVar
) の重要性。 - 一行テキスト入力のための
Entry
ウィジェット。 - 択一選択のための
Radiobutton
ウィジェット。 - ON/OFF選択のための
Checkbutton
ウィジェット。 - モダンなプルダウンメニューである
ttk.Combobox
。
これで、情報を表示するだけでなく、ユーザーの操作を受け取って動的に反応する、本格的なアプリケーションを作成するための部品が全て揃いました。
次回、いよいよ実践編・最終回です! これまで2回にわたって学んだTkinterの知識を総動員して、以前コマンドラインで作成した「材料重量計算スクリプト」にグラフィカルなインターフェースを付け、誰でも直感的に使えるデスクトップアプリへと進化させます! お楽しみに!
コメント
コメントを投稿