増えてきたものが、気になり始める
tkinterで小さなアプリを作っていると、
あるタイミングで、ふと気づくことがあります。
「あれ、変数が増えてきたな」
「関数も、いつの間にか多くなっている」
「動いてはいるけど、全体が少し見えにくい」
第3回までの内容を踏まえていれば、
これは失敗ではありません。
むしろ、順調に進んでいる証拠です。
状態を持ち、
イベントでそれを更新し、
画面に反映する。
この基本が分かってくると、
自然と「扱う情報」が増えていきます。
それに合わせて、
コードの中身も少しずつ賑やかになります。
動く。でも、落ち着かない
ここで多くの人が感じるのが、
言葉にしにくい違和感です。
- どこで何が更新されているのか
- この変数は、誰のものなのか
- 関係している処理が、あちこちに散らばっている気がする
エラーが出るわけでもなく、
動作がおかしいわけでもありません。
それでも、
「このままでいいのかな」
という感覚が残ります。
この違和感は、
まだ知識が足りないからではありません。
むしろその逆で、
理解が進んだからこそ生まれる感覚です。
次に必要なのは、
新しい文法でも、
高度なテクニックでもありません。
増えてきた状態や処理を、
どう整理して考えるか。
第4回では、その入口に立ってみましょう。
第1章:状態が増えると、見通しが悪くなる
tkinterでアプリを作り始めたばかりの頃は、
状態はせいぜい1つか2つです。
カウント用の変数。
表示を切り替えるためのフラグ。
そのくらいなら、
どこで使われているかも一目で分かります。
ところが、
少しだけ機能を足してみると、
状況はすぐに変わります。
- 表示用の状態が増える
- 入力に関する状態が増える
- 処理を分けた結果、関数も増える
どれも自然な流れです。
「アプリらしく」なってきた証拠でもあります。
問題は、増えたことではない
ここで勘違いしやすいのは、
「状態が増えたからダメになった」
と思ってしまうことです。
でも実際には、
問題は数ではありません。
- どの状態が
- どの処理と関係していて
- どこで更新されているのか
そのつながりが、
少しずつ見えにくくなってくること。
グローバル変数が悪者に見え始める瞬間
多くの場合、
このタイミングで
グローバル変数が気になり始めます。
- あちこちから参照されている
- どこで書き換わるのか分かりにくい
- 名前が増えて、把握が大変
とはいえ、
ここまでの書き方が間違っていたわけではありません。
最初はそれで十分だったし、
だからこそ、ここまで来られたのです。
見通しが悪くなるのは、成長のサイン
状態が増えて、
処理も増えて、
全体が少し見えにくくなる。
この感覚は、
「失敗」ではなく、
次の段階に進む合図です。
コードが壊れたわけでも、
理解が足りないわけでもありません。
ただ、
今までと同じ置き方では、
少し窮屈になってきただけ。
ここまで来たら、
次に考えたくなるのは自然とこうです。
「これ、同じ話をしているもの同士で
まとめられないだろうか?」
次の章では、
この人として自然な感覚が、
そのままコードの整理につながっていくところを見ていきます。
第2章:「同じ話」を、ひとまとめにしたくなる
状態が増え、
処理も増えてくると、
コードを眺めたときに、こんな感覚が生まれます。
「この変数と、この関数、
いつも一緒に使っているな」
「この処理は、
この画面のためだけのものだな」
これは、
コードが壊れているサインではありません。
むしろ、関係性が見えてきた証拠です。
人は、自然と「まとまり」を探す
プログラムを書いているとき、
私たちは無意識のうちに、
関係のあるもの同士を結びつけようとします。
- この状態は、この画面のもの
- この処理は、このボタンに関係している
- この表示更新は、この流れの一部
頭の中では、
すでにグループ分けが始まっています。
問題なのは、
そのまとまりが、
まだコードの形になっていないことです。
バラバラでも動く。でも、疲れる
状態と処理が
あちこちに散らばったままでも、
tkinterはちゃんと動いてくれます。
ですが、
- 変更するときに、探す場所が増える
- 関係のない部分まで気にしてしまう
- 「触っていい範囲」が分かりにくい
といった、
小さな疲れが積み重なっていきます。
これは技術的な問題というより、
読み手としての負荷です。
多くの場合、その読み手は自分自身です。
「まとめたい」は、とても健全な感覚
ここで大事なのは、
「まとめたい」と感じたこと自体が、
とても健全だということです。
それは、
- 状態の役割が分かってきた
- 処理の責任範囲が見え始めた
- 全体像を意識できるようになった
という、
理解が一段深まったサインでもあります。
Pythonは、そのための道具を用意している
ここまで来ると、
自然と次の問いが浮かびます。
「この関係性を、
そのままコードにできないだろうか?」
Pythonには、
関連するデータと処理を
ひとまとめにするための仕組みが用意されています。
それは、
何か特別なものではなく、
整理するための箱のような存在です。
次の章では、
その箱を使うと何が変わるのかを、
最小限の形で見ていきましょう。
第3章:クラスは「整理するための箱」
ここまでで、
状態と処理を「ひとまとめにしたい」という感覚が、
かなり自然に育ってきたはずです。
この段階で登場するのが、
Pythonの クラス です。
とはいえ、
ここで身構える必要はありません。
クラスは、
新しい考え方を覚えるものではなく、
今まで考えてきたことを、そのまま入れる箱だからです。
クラスは、状態と処理を一緒に持てる
これまでのコードでは、
- 状態は変数として、あちこちに置かれ
- 処理は関数として、別の場所に書かれていました
それ自体は問題ありません。
ただ、関係性が見えてきた今となっては、
少し散らかって見えるだけです。
クラスを使うと、
- 状態
- その状態を操作する処理
を、同じ場所にまとめることができます。
最小の形で見てみる
まずは、
「これ以上削れない」くらいの形を見てみましょう。
class App:
def __init__(self, root):
self.count = 0
self.label = tk.Label(root, text="0")
self.label.pack()
def on_click(self):
self.count += 1
self.label.config(text=str(self.count))
ここでやっていることは、
今までと何も変わっていません。
countは、これまでの状態on_clickは、これまでの処理
違うのは、
それらが 同じ箱の中に入った という点だけです。
self は「この箱の中身」
クラスが難しく見える原因のひとつが、self という存在です。
でも、
ここではこう考えれば十分です。
self.countは、この箱が持っている状態self.on_clickは、この箱が持っている処理
self は、
「今扱っている、このひとまとまり」を指しているだけ。
特別な魔法でも、
分かりにくい仕組みでもありません。
何が変わったのか
クラスを使ったことで、
コードに起きた変化はとても静かなものです。
- グローバル変数が減った
- 状態の持ち主がはっきりした
- 関係のない部分を、気にしなくてよくなった
結果として、
コード全体が少し静かになります。
これは、
動作が変わったからではなく、
見通しがよくなったからです。
クラスは「正解」ではない
ここで強調しておきたいのは、
クラスを使うこと自体が、
正解でも義務でもないということです。
- 小さいうちは、関数と変数で十分
- 整理したくなったら、使えばいい
- 必要になる前に、無理に使わなくていい
クラスは、
「使わなければいけない道具」ではなく、
使うと楽になる道具です。
ここまで来ると、
クラスはもう
「よく分からない難しいもの」ではなく、
自然な選択肢のひとつとして見えてくるはずです。
次は、
ここまでの第4回全体をまとめながら、
「整理できるようになった状態」を
一度、俯瞰してみましょう。
まとめ ― 整理したくなったら、次の段階
第4回では、
tkinterでアプリを作っていく中で、
状態や処理が増えてきたときに感じる違和感を出発点にしました。
変数が増え、
関数も増え、
全体が少し見えにくくなる。
これは、
何かを間違えた結果ではありません。
むしろ、
理解が進み、アプリらしくなってきた証拠です。
状態を持ち、
イベントでそれを更新し、
画面に反映する。
この流れが自然に書けるようになると、
次に気になってくるのは、
「どう整理すればいいか」という点です。
第4回では、
その整理の仕方として、
クラスを選択肢のひとつとして眺めました。
クラスは、目的ではなく手段
ここで見てきたクラスは、
- 難しい設計のためのものでも
- 正解を押し付けるものでもありません
状態と処理を、
ひとつの箱にまとめるための道具でした。
使えば、
コードの見通しがよくなり、
触る範囲がはっきりします。
でも、
使わなければ動かないわけでもありません。
大切なのは、選べること
tkinterでアプリを書くとき、
大切なのは
「どの書き方が正しいか」ではなく、
「いま、どの書き方が楽か」を選べることです。
- 小さいうちは、シンプルな形で
- 増えてきたら、少し整理して
- さらに育ったら、また考える
その判断ができるようになった時点で、
もうtkinterは
「分からないGUIライブラリ」ではありません。
次に進むとしたら
ここまでで、
- イベント駆動という世界観
- 状態がアプリを形づくること
- 整理するための考え方
が、ひとつの線としてつながりました。
次に見えてくるのは、
- 表示とロジックをどう分けるか
- 画面が増えたらどうするか
- アプリとしてどう育てていくか
といった、
もう一段先の話です。
焦る必要はありません。
今見えている範囲を、
静かに整理できるようになったこと自体が、
大きな前進です。


