Mad_man111
Mad_man111

Reputation: 85

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

I have only done a little work with Tkinter and I enjoy using it but as with any type programing it takes time to learn. I am trying to create a simple To do list that will eventually be saved on a file. But i can't get the button in line 17 to be removed and the on the next line be replace in a different position.

from tkinter import *
import time 

root = Tk()
root.geometry("300x300")
root.title("Programs")
global TDrow
TDrow = 2

def tdTaskAdd():
    global TDrow
    global tdEnter
    TDrow = int(TDrow+1)
    s = tdEntry.get()
    label = Label(ToDoFrame,text=s).grid(row=TDrow,column=1)
    tdEntry.grid(row=TDrow+1,column=1)
    tdEnter.grid_remove()
    tdEnter = Button(ToDoFrame,text="AddTask",command=tdTaskAdd).grid(row=TDrow+2,column=1)

ToDoFrame = Frame()
ToDoFrame.place(x=0,y=10)

tdTitle = Label(ToDoFrame,text="To Do List:").grid(row=TDrow-1,column=1)
tdEntry= Entry(ToDoFrame)
tdEntry.grid(row=TDrow+1,column=1)
tdEntry.insert(0, "Enter a new task")
global tdEnter
tdEnter = Button(ToDoFrame,text="Add Task",command=tdTaskAdd).grid(row=TDrow+2,column=1)
mainloop()

I keep getting an error when running this saying that:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python33\lib\tkinter\__init__.py", line 1475, in __call__
    return self.func(*args)
  File "C:\Users\Eddy\Desktop\pythonStartup.py", line 17, in tdTaskAdd
    tdEnter.grid_remove()
AttributeError: 'NoneType' object has no attribute 'grid_remove'

Upvotes: 2

Views: 3910

Answers (1)

tobias_k
tobias_k

Reputation: 82949

The problem is this line:

tdEnter = Button(ToDoFrame,text="Add Task",command=tdTaskAdd).grid(row=TDrow+2,column=1)

This way, tdEnter is not the Button, but the return value of grid, i.e. None.

Try this instead:

tdEnter = Button(ToDoFrame,text="Add Task",command=tdTaskAdd)
tdEnter.grid(row=TDrow+2,column=1)

Same for label and when you create a new button in your tdAddTask function.

BTW, no need to add a new button each time, just call it's grid method to repositon it.

Upvotes: 3

Related Questions