MeWrite Docs

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 などに変わります。

原因

  1. 生成と配置を同一行に記述: widget = tk.Entry(root).pack()pack() の戻り値 None を代入してしまう(最頻パターン)。
  2. 関数の return 忘れ: ウィジェットを作る関数が値を返さず、暗黙の None を受け取っている。
  3. grid() / place() でも同様: pack() だけでなく grid()place()None を返す。

解決策

1. 生成と配置を別の行に分ける

1
2
3
4
5
6
7
8
9
import tkinter as tk

root = tk.Tk()

entry = tk.Entry(root)   # 1. ウィジェットを生成して変数に代入
entry.pack()             # 2. 配置は別の行で呼ぶ

root.mainloop()
print(entry.get())       # OK: entry は Entry オブジェクト

次の書き方は entryNone になるため避けます。

1
2
# NG: pack() の戻り値 None が代入される
entry = tk.Entry(root).pack()

2. ウィジェットを返す関数では明示的に return する

1
2
3
4
5
6
7
def make_entry(parent):
    e = tk.Entry(parent)
    e.pack()
    return e  # ウィジェットを返す(return を忘れると None になる)

entry = make_entry(root)
entry.insert(0, "hello")  # OK

3. None ガードで属性アクセス前に確認する

dict.get()re.match() など None を返しうる呼び出しでも同じエラーが起きます。

1
2
3
value = mapping.get(key)
if value is not None:
    value.strip()  # None でないときだけ属性アクセス

よくある間違い

grid()place() でも戻り値は None です。配置メソッドはすべて「副作用のみ・戻り値なし」と覚えておきます。

1
2
3
# NG: いずれも None が代入される
label = tk.Label(root, text="x").grid(row=0)
button = tk.Button(root, text="OK").place(x=10, y=10)

関連エラー

関連エラー

Python の他のエラー

最終更新: 2026-06-05