【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の知識を総動員して、以前コマンドラインで作成した「材料重量計算スクリプト」にグラフィカルなインターフェースを付け、誰でも直感的に使えるデスクトップアプリへと進化させます! お楽しみに!

その他の投稿はこちら

コメント

このブログの人気の投稿

タイトルまとめ

これで迷わない!WindowsでPython環境構築する一番やさしい方法 #0

【Python標準ライブラリ完結!】11の冒険をありがとう!君のPython力が飛躍する「次の一歩」とは? 🚀