Reputation: 293
I have run into this issue and I can't understand why.
I took my code from my application and made this test code so you don't have to go through a bunch of junk to see what I am asking.
I have this working in other code. But after comparing the two, I can't for the life of me figure this out.
In this application, I get the error "AttributeError: 'NoneType' object has no attribute 'delete' ".
import Tkinter as tk
def main():
mainWindow = tk.Tk()
v = tk.StringVar()
entryBox = tk.Entry(mainWindow, textvariable=v).grid(column=0, row=1)
def test():
entryBox.delete(0,20)
testButton = tk.Button(mainWindow, text='Go!', command=test, padx=10).grid(row=2, column=0)
tk.mainloop()
main()
Upvotes: 5
Views: 30047
Reputation: 11
If you want to clear Entry widget, instead of deleting widget content clear the text variable.
text_variable.set("") or v.set("")
Upvotes: 0
Reputation: 11
entryBox = tk.Entry(mainWindow, textvariable=v).grid(column=0, row=1)
#instead of using in same line you can do like this
entryBox = tk.Entry(mainWindow, textvariable=v) entryBox.grid(column=0, row=1)
Upvotes: 1
Reputation: 2075
In this line:
entryBox = tk.Entry(mainWindow, textvariable=v).grid(column=0, row=1)
grid doesn't return anything, so entryBox is None
, which doesn't have a delete method. You have to set entryBox
to tk.Entry(mainWindow, textvariable=v)
then call the grid
method on entryBox
Upvotes: 12
Reputation: 6438
The reason this is happening is because you are gridding it in the same variable. If you change your code to the following, it should work:
import Tkinter as tk
def main():
mainWindow = tk.Tk()
v = tk.StringVar()
entryBox = tk.Entry(mainWindow, textvariable=v)
def test():
entryBox.delete(0,20)
testButton = tk.Button(mainWindow, text='Go!', command=test, padx=10)
testButton.grid(row=2, column=0)
entryBox.grid(column=0, row=1)
tk.mainloop()
main()
The reason this works is because grid()
does not return anything.
Upvotes: 1
Reputation: 56951
The entryBox
that you have declared here has not been obtained yet when you are trying to do call delete
on that. If you want a simple way to reproduce the error.
In [1]: x = None
In [2]: x.delete
AttributeError: 'NoneType' object has no attribute 'delete'
To fix this you can wrap the entryBox or ensure that it is obtained.
if entryBox:
entryBox.delete(0, 20)
Upvotes: 0