web-dev-qa-db-ja.com

Tkinter:AttributeError:NoneTypeオブジェクトに属性がありません<属性名>

このシンプルなGUIを作成しました。

from tkinter import *

root = Tk()

def grabText(event):
    print(entryBox.get())    

entryBox = Entry(root, width=60).grid(row=2, column=1, sticky=W)

grabBtn = Button(root, text="Grab")
grabBtn.grid(row=8, column=1)
grabBtn.bind('<Button-1>', grabText)

root.mainloop()

UIを起動して実行します。 Grabボタンをクリックすると、コンソールに次のエラーが表示されます。

C:\Python> python.exe myFiles\testBed.py
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python\lib\lib-tk\Tkinter.py", line 1403, in __call__
    return self.func(*args)
  File "myFiles\testBed.py", line 10, in grabText
    if entryBox.get().strip()=="":
AttributeError: 'NoneType' object has no attribute 'get'

entryBoxNoneに設定されているのはなぜですか?

37
Arnkrishn

gridオブジェクトおよび他のすべてのウィジェットのpackplaceおよびEntry関数は、Noneを返します。 python a().b()を実行すると、式の結果はb()が返すものになります。したがって、Entry(...).grid(...)None

このように2行に分割する必要があります。

entryBox = Entry(root, width=60)
entryBox.grid(row=2, column=1, sticky=W)

そうすれば、Entry参照をentryBoxに保存し、期待どおりにレイアウトできます。これには、すべてのgridおよび/またはpackステートメントをブロックで収集すると、レイアウトの理解と保守が容易になるというボーナスの副作用があります。

74
Nick Meharry

この行を変更します。

entryBox=Entry(root,width=60).grid(row=2, column=1,sticky=W)

これらの2行に:

entryBox=Entry(root,width=60)
entryBox.grid(row=2, column=1,sticky=W)

すでにgrabBtnに対して正しく行っているように!

5
Alex Martelli