AttributeError: el objeto ‘NoneType’ no tiene atributo ‘grid_remove’

Solo he hecho un pequeño trabajo con Tkinter y disfruto usarlo, pero como con cualquier tipo de progtwigción, toma tiempo aprender. Estoy intentando crear una lista de tareas simple que finalmente se guardará en un archivo. Pero no puedo quitar el botón de la línea 17 y el de la línea siguiente se puede reemplazar en una posición diferente.

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() 

Sigo recibiendo un error al ejecutar esto diciendo que:

 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' 

El problema es esta línea:

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

De esta manera, tdEnter no es el Button , sino el valor de retorno de la grid , es decir, None .

Intenta esto en su lugar:

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

Lo mismo para la label y cuando creas un nuevo botón en tu función tdAddTask .

Por cierto, no es necesario agregar un nuevo botón cada vez, simplemente llame a su método de grid para volver a colocarlo.