Python | 1 日 120 分 × 7 日アプリ学習:tkinterで作るGUIアプリ(中級編)

Web APP Python
スポンサーリンク

3日目のゴール

3日目のテーマは
「ボタンと“入力”を組み合わせて、ユーザーの値を扱えるようになる」 ことです。

1日目:ボタンを押したら関数が呼ばれる
2日目:複数ボタン・lambda で引数付きイベント

3日目では一歩進んで、

テキスト入力欄(Entry)を使う
ボタンを押したときに入力内容を読む
入力内容をラベルに表示したり、チェックしたりする

という、「GUIで“値”を扱う基礎」を身につけます。


Entry(テキスト入力欄)を知る

コンソールの input() を GUI に持ってくるイメージ

これまでのコンソールアプリでは、

name = input("名前を入力してください: ")
Python

のようにして、
ユーザーから文字列を受け取っていました。

GUIでは、これに相当するのが Entry です。

まずは、入力欄とボタンとラベルを並べてみましょう。

import tkinter as tk

root = tk.Tk()
root.title("Entryの基本")

entry = tk.Entry(root)
entry.pack()

button = tk.Button(root, text="OK")
button.pack()

label = tk.Label(root, text="ここに結果が出ます")
label.pack()

root.mainloop()
Python

この時点では、
入力欄に文字は打てますが、
ボタンを押しても何も起きません。

ここに「ボタンイベント」と「Entryの値の取得」をつなげていきます。


Entry から値を取り出す

get() で「今の入力内容」を読む

Entry に入力された文字は、
entry.get() で取り出せます。

さっきのコードに、ボタンイベントを足してみます。

import tkinter as tk

def on_ok_click():
    text = entry.get()
    label.config(text=f"あなたが入力したのは: {text}")

root = tk.Tk()
root.title("Entryから値を読む")

entry = tk.Entry(root)
entry.pack()

button = tk.Button(root, text="OK", command=on_ok_click)
button.pack()

label = tk.Label(root, text="ここに結果が出ます")
label.pack()

root.mainloop()
Python

流れを言葉で追うとこうです。

ユーザーが Entry に文字を入力する
ボタン「OK」を押す
on_ok_click が呼ばれる
entry.get() で入力内容を文字列として取得する
ラベルの text をその文字列で書き換える

ここでの重要ポイントは、

Entry は「入力欄そのもの」
get() は「今の中身を取り出す操作」

という分け方です。


Entry の中身をクリアする

入力後に欄を空にする

多くのアプリでは、
「入力してボタンを押したら、入力欄を空に戻す」
という動きが自然です。

Entry の中身を消すには、delete を使います。

entry.delete(0, tk.END)
Python

これは、

「0文字目から、最後までを削除する」

という意味です。

さっきの on_ok_click を少しだけ改造してみます。

def on_ok_click():
    text = entry.get()
    label.config(text=f"あなたが入力したのは: {text}")
    entry.delete(0, tk.END)
Python

これで、

入力 → ボタン → ラベルに表示 → 入力欄が空になる

という流れになります。


数値入力+ボタンで簡単な計算をする

「文字列としての入力」を「数値として扱う」

Entry から取り出した値は、
最初は必ず「文字列」です。

例えば、"123" という文字列を
int("123") で整数に変換して使います。

簡単な「2倍計算アプリ」を作ってみましょう。

import tkinter as tk

def on_calc_click():
    text = entry.get()
    try:
        value = int(text)
    except ValueError:
        label.config(text="数字を入力してください")
        return

    result = value * 2
    label.config(text=f"結果: {result}")
    entry.delete(0, tk.END)

root = tk.Tk()
root.title("2倍計算アプリ")

entry = tk.Entry(root)
entry.pack()

button = tk.Button(root, text="2倍にする", command=on_calc_click)
button.pack()

label = tk.Label(root, text="ここに結果が出ます")
label.pack()

root.mainloop()
Python

ここでの大事なポイントは二つです。

Entry からの値は文字列なので、int() で変換している
数字以外が入力されたときに備えて try / except を入れている

GUIでも、
「入力 → 型変換 → エラーの可能性」
という流れはコンソールと同じです。


ボタンを「複数の Entry と組み合わせる」

2つの数値を足し算するアプリ

次は、Entry を2つ使ってみます。

仕様はこうです。

上の入力欄に数値1
下の入力欄に数値2
「足し算」ボタンを押すと、合計をラベルに表示

コードはこうなります。

import tkinter as tk

def on_add_click():
    text1 = entry1.get()
    text2 = entry2.get()

    try:
        value1 = int(text1)
        value2 = int(text2)
    except ValueError:
        label.config(text="両方とも数字を入力してください")
        return

    result = value1 + value2
    label.config(text=f"結果: {result}")

root = tk.Tk()
root.title("足し算アプリ")

entry1 = tk.Entry(root)
entry1.pack()

entry2 = tk.Entry(root)
entry2.pack()

button = tk.Button(root, text="足し算", command=on_add_click)
button.pack()

label = tk.Label(root, text="ここに結果が出ます")
label.pack()

root.mainloop()
Python

ここでのポイントは、

Entry が増えても、やることは同じ
get() で文字列を取り出し、必要なら int() で変換する
ボタンイベントの中で、複数の Entry をまとめて扱う

という「パターン」が見えてくることです。


ボタンの有効・無効を切り替える

Entry が空のときはボタンを押せなくする

少しだけ“アプリっぽい”ことをしてみましょう。

「何も入力されていないときは、ボタンを押せないようにする」
という動きです。

ボタンには state という設定があります。

button.config(state="disabled")  # 無効
button.config(state="normal")    # 有効
Python

これを使って、
「Entry に何か入力されたらボタンを有効にする」
という動きを作ってみます。


Entry の変化を監視する(少しだけ応用)

ここは少しだけ難しめですが、
「こんなこともできるんだ」と思えれば十分です。

Entry の中身が変わったときに呼ばれる仕組みとして、
StringVar を使う方法があります。

import tkinter as tk

def on_text_change(*args):
    text = text_var.get()
    if text.strip() == "":
        button.config(state="disabled")
    else:
        button.config(state="normal")

root = tk.Tk()
root.title("入力でボタンON/OFF")

text_var = tk.StringVar()
text_var.trace_add("write", on_text_change)

entry = tk.Entry(root, textvariable=text_var)
entry.pack()

button = tk.Button(root, text="送信", state="disabled")
button.pack()

root.mainloop()
Python

流れを説明します。

StringVar() は「文字列を保持する特別な変数」
Entry に textvariable=text_var と渡すと、
Entry の中身と text_var が自動的に同期される

text_var.trace_add("write", on_text_change) は、
「text_var が書き換えられたときに on_text_change を呼ぶ」
という意味です。

on_text_change の中では、

今の文字列を text_var.get() で取得
空ならボタンを無効(disabled)
何か入っていればボタンを有効(normal)

という処理をしています。

2日目・3日目の段階では、
「ボタンの state を変えられる」
というところだけでも押さえておけばOKです。


3日目のミニアプリ:自己紹介メッセージメーカー

仕様

名前と好きなものを入力すると、
「私は〇〇です。〇〇が好きです。」
というメッセージを作ってくれるアプリ。

Entry を2つ使う
ボタンを1つ使う
ラベルに結果を表示する

コード

import tkinter as tk

def on_make_message():
    name = entry_name.get().strip()
    like = entry_like.get().strip()

    if name == "" or like == "":
        label_result.config(text="名前と好きなものを両方入力してください。")
        return

    message = f"私は{name}です。{like}が好きです。"
    label_result.config(text=message)

root = tk.Tk()
root.title("自己紹介メッセージメーカー")

label_name = tk.Label(root, text="名前:")
label_name.pack()
entry_name = tk.Entry(root)
entry_name.pack()

label_like = tk.Label(root, text="好きなもの:")
label_like.pack()
entry_like = tk.Entry(root)
entry_like.pack()

button = tk.Button(root, text="メッセージを作る", command=on_make_message)
button.pack()

label_result = tk.Label(root, text="ここにメッセージが表示されます")
label_result.pack()

root.mainloop()
Python

ここまで動かせたら、

Entry で文字を入力する
ボタンでイベントを起こす
ラベルで結果を見せる

という「GUIの基本三角形」が、
自分の手で回せている状態です。


3日目で絶対に押さえてほしい本質

GUIは「入力欄+ボタン+表示」の組み合わせ

今日いちばん大事なのは、

Entry(入力欄)で文字を受け取る
Button(ボタン)で「いつ処理するか」を決める
Label(ラベル)で結果を見せる

この3つを組み合わせると、
もう立派な「小さなアプリ」になる、という感覚です。

技術的なキーワードをまとめると、

Entry の get() で文字列を取り出す
必要なら int() などで型変換する
ラベルの config(text=...) で画面を更新する
ボタンの command= に処理を書く

この4つが、
「GUIで入力を扱うための基本セット」になります。

4日目以降は、
レイアウト(grid)、チェックボックス、ラジオボタンなどを足して、
画面の構成力を上げていきます。
まずは今日の自己紹介アプリを、自分なりに

項目を増やす
メッセージの文章を変える
フォントや色を変える

など、少し遊びながら体に馴染ませていきましょう。

タイトルとURLをコピーしました