まずは、動かしてみよう
第1回では、tkinterが
「画面を作るためのスクリプト」ではなく、
イベント駆動という世界観の中で動くプログラムであることを見てきました。
とはいえ、
世界観や考え方を読んで「なるほど」と思っても、
実際に動かしてみないと、
まだどこか実感が湧かないかもしれません。
そこで今回は、
最小限のコードだけを使って、
tkinterのイベント駆動を体感してみます。
難しい説明は後回しです。
まずは動かして、
「呼ばれて動く」「待って反応する」
その感覚を掴んでいきましょう。
第1章:何もしないウィンドウを表示してみよう
まずは、本当に何もしないウィンドウを表示してみます。
ボタンも、ラベルも、イベント処理もありません。
やることは、ウィンドウを作って表示するだけです。
import tkinter as tk
root = tk.Tk()
root.mainloop()
たったこれだけです。
実行すると、小さなウィンドウが表示され、
閉じるまでそのまま画面に残り続けます。
何も書いていないのに、動いている
このコードには、
- while も
- after も
- イベント処理も
一切出てきません。
それでもウィンドウは表示され、
ドラッグすれば動き、
閉じるボタンもきちんと反応します。
ここで大切なのは、
すでにイベント駆動が始まっているということです。
mainloop が「待っている」
mainloop() が呼ばれた瞬間、
プログラムは「待つ世界」に入ります。
- クリックされるのを待つ
- 操作されるのを待つ
- 閉じられるのを待つ
私たちのコードは、
その間、何もしていません。
それでもGUIは止まりません。
なぜなら、
待っているのは mainloop だからです。
この時点で分かってほしいこと
この最小コードから、
すでに次のことが分かります。
- tkinterは、上から下に流れて終わるプログラムではない
- 何もしなくても、世界は動いている
- プログラムは「回す」必要がない
これが、第1回で話した
「待つプログラム」 の正体です。
次にやること
次は、このウィンドウに
イベントを1つだけ足してみます。
ボタンを1つ置いて、
押されたときに
「呼ばれて処理が動く」
その感覚を確かめてみましょう。
第2章:イベントを1つだけ足してみよう
次は、ウィンドウに
イベントを1つだけ足してみます。
ここでやるのは、とてもシンプルなことです。
ボタンを1つ置いて、
押されたときに処理が動くようにします。
ボタンを置いてみる
import tkinter as tk
def on_click():
print("ボタンが押されました")
root = tk.Tk()
button = tk.Button(root, text="クリック", command=on_click)
button.pack()
root.mainloop()
ウィンドウに「クリック」というボタンが表示され、
押すと、コンソールに文字が出力されます。
自分で呼んでいないのに、動く
このコードで大事なのは、on_click() を自分で一度も呼んでいないという点です。
def on_click():
print("ボタンが押されました")
この関数は、
- 実行もしていない
- ループにも入れていない
- どこから呼ばれるかも書いていない
それでも、
ボタンを押すと確実に動きます。
「command」は約束
button = tk.Button(root, text="クリック", command=on_click)
ここでしているのは、
「このイベントが起きたら、この処理を呼んでください」
という約束を渡しているだけです。
- いつ呼ばれるかは自分で決めない
- 呼ぶタイミングは mainloop に任せる
- 自分は反応だけを書く
これが、イベント駆動の基本形です。
なぜ GUI は止まらないのか
このコードには、
- while
- 待ち処理
- 時間管理
が一切ありません。
それでも、
- 画面は反応し続け
- ボタンは押せて
- ウィンドウも自由に動かせます
なぜなら、
自分のコードが世界を占有していないからです。
ここで感じてほしいこと
この時点で、
次の感覚が少しでも掴めていれば大丈夫です。
- 処理は「流す」ものではない
- 処理は「呼ばれる」もの
- 自分は世界を回さなくていい
これが、
第1回で話した
「委ねる」 という感覚の正体です。
次に進む前に
まだ after() は出てきません。
でも実は、
今見ているこの仕組みの延長線上に
時間の扱いもあります。
次の章では、
👉 時間もイベントとして扱ってみる
つまり after() を使って、
「待たずに、時間に反応する」
という感覚を体感してみましょう。
第3章:after() で「時間」もイベントにしてみよう
これまでで、
tkinterでは処理が 自分から動くのではなく、呼ばれて動く
という感覚が少し掴めてきたと思います。
次はもう一歩だけ進んで、
時間の経過もイベントとして扱ってみましょう。
ここで使うのが after() です。
ボタンを押して、少し待ってから動かす
まずはコードを見てみます。
import tkinter as tk
def delayed_action():
label.config(text="1秒たちました")
def on_click():
label.config(text="待っています…")
root.after(1000, delayed_action)
root = tk.Tk()
label = tk.Label(root, text="ボタンを押してください")
label.pack(pady=10)
button = tk.Button(root, text="クリック", command=on_click)
button.pack(pady=10)
root.mainloop()
ボタンを押すと、
すぐに表示が変わり、
1秒後にもう一度、表示が変わるはずです。
待っているのは、自分ではない
ここで注目してほしいのは、
私たちのコードの中に
待っている処理が一切ないことです。
time.sleep()は使っていないwhileも回していない
それでも、
「1秒後に処理が実行される」
という振る舞いが実現できています。
これは、
待っているのが mainloop だからです。
after() は、
「1秒後に、この関数を呼んでください」
と、世界に予約を入れているだけ。
自分が待つ必要はありません。
after() はループではない
よくある誤解として、after() を while の代わりに使おうとする人がいます。
ですが、after() 自体は
一度きりの予約です。
繰り返したい場合は、
処理の最後で、
もう一度 after() を呼びます。
def tick():
print("tick")
root.after(1000, tick)
この形は少し不思議に見えるかもしれませんが、
tkinterの世界ではとても自然です。
- 処理が終わったら
- 次の予定を入れる
それだけのことです。
「時間もイベント」という感覚
ここまで来ると、
イベントとは
「クリック」や「入力」だけではない
と分かってきます。
- ボタンが押される
- ウィンドウが閉じられる
- 時間が経過する
これらはすべて、
tkinterにとっては
**同じ“イベント”**です。
だからこそ、
- GUIは固まらず
- ユーザー操作も失われず
- プログラムは素直に動き続ける
という状態が保たれます。
この章で持ち帰ってほしいこと
第3章で伝えたいのは、
たったこれだけです。
- 待つのは自分ではない
- 時間もイベントとして扱える
- after() は世界に予定を預ける仕組み
これが分かれば、
tkinterで「一定時間ごとに何かする」
という処理は、もう怖くありません。
次に進むなら
次は、
状態を持って表示を更新する
という話に進めます。
少しずつ、
「アプリらしさ」が出てきますが、
考え方は、今までと同じです。
第2回まとめ ― 「体感」できたなら十分
第2回では、
tkinterのイベント駆動を
最小限のコードで体感してきました。
- 何もしないウィンドウでも、世界は動いている
- ボタンを置くと、処理は「呼ばれて」動く
- after() を使えば、時間もイベントとして扱える
どれも難しいことはしていません。
それでも、
tkinterがどんな姿勢で動いているのかは、
少しずつ見えてきたはずです。
ここで大切なのは、
すべてを理解しきることではありません。
「あ、こういう感じなんだ」
その感覚があれば、もう十分です。
イベント駆動の世界では、
自分が処理の流れを抱え込む必要はありません。
何かが起きたら呼ばれる。
時間が来たら呼ばれる。
その約束を書いておくだけで、
世界はきちんと回り続けます。
第1回で「考え方」を知り、
第2回で「体感」できたなら、
tkinterはもう未知の存在ではありません。
次回は、
このイベント駆動の世界に
**「状態」**を少しだけ持ち込みます。
表示を変える。
値を覚える。
GUIが少しずつ
「アプリらしく」なっていく過程を見ていきましょう。


