Question

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()
Was it helpful?

Solution

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

OTHER TIPS

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.

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)

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)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top