1日目のゴール
1日目のテーマは
「tkinterでウィンドウを出して、ボタンを押したら何かが起きる」
ここまでを自分の手で動かせるようになることです。
今日できるようになってほしいのは、この2つです。
ウィンドウ(画面)を表示できる
ボタンをクリックしたときに、自分の書いた関数が呼ばれる
これができたら、もう「GUIプログラマーの入り口」に立っています。
GUIってそもそも何者?
コンソールとの違いをイメージする
これまでの学習では、こんな感じでした。
input() で文字を入力print() で結果を表示
黒い画面(コンソール)でやりとり
GUIは、これを「画面の部品」でやる世界です。
ウィンドウ(アプリの枠)
ラベル(文字を表示する部品)
ボタン(クリックできる部品)
テキストボックス(文字を入力する部品)
などを組み合わせて、
「見て触れるアプリ」を作っていきます。
tkinterは、Pythonに標準で付いている
「GUIを作るための道具箱」 だと思ってください。
tkinterの最小構成を知る
「ウィンドウを出すだけ」の超ミニマムコード
まずは、ウィンドウを出すだけのコードを見てみましょう。
import tkinter as tk
root = tk.Tk()
root.title("はじめてのGUI")
root.mainloop()
Pythonこれだけで、小さなウィンドウが出ます。
ここで超重要なポイントを、ひとつずつ噛み砕きます。
import tkinter as tk
tkinter というモジュールを読み込んで、
それを tk という短い名前で使う、という意味です。
以降、tk.Tk() や tk.Button() のようにtk. から始まるクラスや関数を使っていきます。
root = tk.Tk()
Tk() は「アプリの一番上のウィンドウ」を作るクラスです。
慣習的に、このウィンドウを root と呼びます。
ここで作られるのは、
「このアプリの土台になるウィンドウ」
だと思ってください。
root.title(“はじめてのGUI”)
ウィンドウのタイトルバーに表示される文字を設定しています。
ここは好きな文字でOKです。
root.mainloop()
これが、GUIアプリの心臓です。
「イベントループ」と呼ばれるもので、
ウィンドウを表示し続ける
ボタンが押されたか
ウィンドウが閉じられたか
マウスが動いたか
などを、ずっと監視し続ける役割を持っています。
mainloop() を呼ばないと、
ウィンドウは一瞬で消えてしまいます。
ボタンを置いてみる
ウィンドウの中に「部品」を乗せる感覚
次は、ウィンドウの中にボタンを置いてみましょう。
import tkinter as tk
root = tk.Tk()
root.title("ボタンの練習")
button = tk.Button(root, text="押してみてね")
button.pack()
root.mainloop()
Pythonここで新しく出てきたものを説明します。
tk.Button(root, text=”押してみてね”)
Button は「ボタン部品」を作るクラスです。
最初の引数 root は
「このボタンをどのウィンドウの上に置くか」を表しています。
text="押してみてね" は、
ボタンの上に表示する文字です。
ここでは、まだ「押しても何も起きないボタン」です。
button.pack()
pack() は、
「この部品をウィンドウの中に配置してね」という命令です。
GUIでは、
部品を作る(Button, Label など)
どこに置くかを決める(pack, grid など)
の2ステップが必要になります。
1日目では、配置方法は pack() だけ覚えれば十分です。
ボタンを押したときに「関数を呼ぶ」
callback(コールバック)という考え方
いよいよ、ボタンを押したときに
何かが起きるようにしてみましょう。
import tkinter as tk
def on_button_click():
print("ボタンが押されました!")
root = tk.Tk()
root.title("ボタンイベント")
button = tk.Button(root, text="押す", command=on_button_click)
button.pack()
root.mainloop()
Pythonここが、今日の一番の山場です。
大事なところをじっくり見ていきます。
関数 on_button_click を定義する
def on_button_click():
print("ボタンが押されました!")
Pythonこれは、
「ボタンが押されたときに実行してほしい処理」
をひとまとめにした関数です。
中身は print() だけですが、
ここに何を書いてもOKです。
command=on_button_click が超重要
button = tk.Button(root, text="押す", command=on_button_click)
Pythoncommand= に「関数そのもの」を渡しています。
ここで絶対に覚えてほしいポイントがあります。
command=on_button_click ← 正しいcommand=on_button_click() ← 間違い
on_button_click は「関数そのもの」on_button_click() は「関数をその場で呼び出した結果」
です。
GUIでは、
「今すぐ実行する」のではなく
「あとでボタンが押されたときに実行してほしい」
ので、カッコを付けずに関数名だけ渡します。
これを「コールバック関数」と呼びます。
画面上で変化が見えるようにする
ラベルの文字をボタンで変える
print() だとコンソールに出るだけなので、
画面上で変化が見える例にしてみましょう。
import tkinter as tk
def on_button_click():
label.config(text="ボタンが押されました!")
root = tk.Tk()
root.title("ラベル更新")
label = tk.Label(root, text="まだ押されていません")
label.pack()
button = tk.Button(root, text="押す", command=on_button_click)
button.pack()
root.mainloop()
Pythonここで新しく出てきたものを説明します。
tk.Label(root, text=”…”)
Label は「文字を表示する部品」です。
ここでは最初の状態として
「まだ押されていません」と表示しています。
label.config(text=”…”)
config() は、
「この部品の設定を変更する」ためのメソッドです。
text="ボタンが押されました!" とすることで、
ラベルの表示文字を変更しています。
ここでの流れはこうです。
アプリ起動時:ラベルに「まだ押されていません」
ボタンが押される:on_button_click が呼ばれるon_button_click の中で label.config(...) が実行される
ラベルの文字が「ボタンが押されました!」に変わる
これで、
「ボタンを押す → 画面が変わる」
という、GUIらしい体験ができます。
ちょっとだけ応用:カウンターアプリ
押した回数を数える
もう一歩だけ進んで、
「ボタンを押した回数」を表示するアプリを作ってみます。
import tkinter as tk
count = 0
def on_button_click():
global count
count += 1
label.config(text=f"{count} 回押されました")
root = tk.Tk()
root.title("カウンター")
label = tk.Label(root, text="まだ押されていません")
label.pack()
button = tk.Button(root, text="押す", command=on_button_click)
button.pack()
root.mainloop()
Pythonここでのポイントを説明します。
count という変数で回数を覚えておく
count = 0
Pythonこれは、「今何回押されたか」を覚えておくための変数です。
global count の意味
def on_button_click():
global count
count += 1
...
Pythonglobal count は、
「関数の外で定義された count を、この関数の中でも使います」
という宣言です。
これを付けないと、
関数の中で count += 1 と書いたときに
「ローカル変数としての count」とみなされてエラーになります。
1日目では、
「関数の外の変数を中で書き換えたいときは global が必要」
くらいの理解でOKです。
よくあるつまずきポイント
1. command に () を付けてしまう
さっきも言いましたが、これは本当に多いです。
button = tk.Button(root, text="押す", command=on_button_click()) # ダメ
Pythonこう書くと、
アプリ起動時に on_button_click() が実行されてしまう
ボタンを押しても何も起きない
という状態になります。
正しくはこうです。
button = tk.Button(root, text="押す", command=on_button_click) # OK
Python「あとで呼んでほしい関数は、カッコを付けずに渡す」
これを体に染み込ませてください。
2. mainloop() を忘れる
root.mainloop()
Pythonこれを忘れると、
ウィンドウが一瞬で消えます。
GUIアプリでは、
「最後に必ず mainloop() を呼ぶ」
というのをお約束として覚えておきましょう。
3. pack() を呼び忘れる
部品を作っただけでは、画面に出ません。
label = tk.Label(root, text="こんにちは")
# label.pack() を忘れると、何も見えない
Pythonpack() は
「この部品を画面に乗せる」
という意味だとイメージしておくと忘れにくいです。
1日目のミニアプリ:簡単メッセージ切り替えアプリ
仕様
ウィンドウにラベルとボタンを1つずつ置く
最初は「こんにちは」と表示
ボタンを押すと「こんばんは」に変わる
もう一度押すと「こんにちは」に戻る
コード
import tkinter as tk
is_hello = True
def on_button_click():
global is_hello
if is_hello:
label.config(text="こんばんは")
is_hello = False
else:
label.config(text="こんにちは")
is_hello = True
root = tk.Tk()
root.title("メッセージ切り替え")
label = tk.Label(root, text="こんにちは")
label.pack()
button = tk.Button(root, text="切り替え", command=on_button_click)
button.pack()
root.mainloop()
Pythonここまで動かせたら、
「GUIの入り口」は完全に突破できています。
1日目で絶対に押さえてほしい本質
GUIは「イベントに反応する世界」
コンソールアプリは、
上から下に順番に処理が流れていく世界
でした。
GUIアプリは、
ボタンが押されたとき
ウィンドウが閉じられたとき
何か“イベント”が起きたときに
登録しておいた関数(コールバック)が呼ばれる世界
です。
今日のキーワードをまとめると、
Tk() でウィンドウを作るButton や Label で部品を作るpack() で画面に乗せるcommand=関数名 でボタンイベントを登録するmainloop() でイベントを待ち続ける
この5つです。
2日目以降は、
テキスト入力、複数ボタン、レイアウトの工夫などに進んでいきます。
まずは今日のコードを、自分なりに
ボタンの文字を変える
ラベルの初期メッセージを変える
カウンターの初期値を変える
など、少しずついじって「触って覚える」時間を取ってみてください。

