Phil J Fry
Phil J Fry

Reputation: 293

AttributeError: 'NoneType' object has no attribute 'delete'

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

Answers (5)

Ayan Khan
Ayan Khan

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

Suraj Tiwari
Suraj Tiwari

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

Tom Smilack
Tom Smilack

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

IT Ninja
IT Ninja

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

Senthil Kumaran
Senthil Kumaran

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

Related Questions