Python Tkinter: 'NoneType' object has no attribute(pack/grid が None を返す)
Tkinterでウィジェット生成とpack/grid/placeを同じ行に書くとNoneが代入され、属性アクセスでAttributeErrorになる原因と解決策
概要
Tkinterで entry = tk.Entry(root).pack() のようにウィジェットの生成とジオメトリ管理(pack / grid / place)を同じ行に書くと、変数には None が代入されます。pack() などは配置を行うだけで戻り値が None のためです。その後 entry.get() などを呼ぶと 'NoneType' object has no attribute になります。
エラーメッセージ
Traceback (most recent call last):
File "app.py", line 12, in <module>
print(entry.get())
^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'get'
Python 3.14 では ^^^^^ でエラー箇所が指し示されます。get の部分はウィジェットの種類によって insert, config, delete などに変わります。
原因
- 生成と配置を同一行に記述:
widget = tk.Entry(root).pack()はpack()の戻り値Noneを代入してしまう(最頻パターン)。 - 関数の
return忘れ: ウィジェットを作る関数が値を返さず、暗黙のNoneを受け取っている。 grid()/place()でも同様:pack()だけでなくgrid()・place()もNoneを返す。
解決策
1. 生成と配置を別の行に分ける
| |
次の書き方は entry が None になるため避けます。
| |
2. ウィジェットを返す関数では明示的に return する
| |
3. None ガードで属性アクセス前に確認する
dict.get() や re.match() など None を返しうる呼び出しでも同じエラーが起きます。
| |
よくある間違い
grid() や place() でも戻り値は None です。配置メソッドはすべて「副作用のみ・戻り値なし」と覚えておきます。
| |
関連エラー
関連エラー
Python の他のエラー
この記事は役に立ちましたか?