このシンプルな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'
entryBox
がNone
に設定されているのはなぜですか?
grid
オブジェクトおよび他のすべてのウィジェットのpack
、place
および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
ステートメントをブロックで収集すると、レイアウトの理解と保守が容易になるというボーナスの副作用があります。
この行を変更します。
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
に対して正しく行っているように!