Problema al borrar el widget Tkinter Canvas utilizando también matplotlib

Esto representa el ángulo de dispersión frente a la distancia del detector una vez que se han ingresado ciertas variables en los campos de entrada y se ha hecho clic en el botón ‘trazar’. Esta ttwig aparece en el canvas que he creado. El método de trazado es ‘def flup ()’, aproximadamente a la mitad del código que se lleva a cabo haciendo clic en el botón llamado ‘bgra’.

Cuando modifico las variables en los campos de entrada y luego presiono el gráfico nuevamente, el progtwig agrega otro gráfico al canvas, lo cual está bien. Lo que quiero hacer es agregar un botón cuyo comando es limpiar todo el canvas.

Justo debajo del método de trazado ‘flup ()’ está el inicio de un método llamado def clear () en el que quiero definir una función que utilizará un botón para borrar el canvas. Observará que ese botón se ha creado unas pocas líneas debajo de eso y se llama “eliminar”. ¿Podría alguien darme un ejemplo del pequeño fragmento de código que tendré que incluir en el método def clear () para que ese botón borre el canvas?

from numpy import * import matplotlib.pyplot as plt fromTkinter import * import tkMessageBox from pylab import savefig from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg,NavigationToolbar2TkAgg import matplotlib.backend_bases from matplotlib.figure import Figure def rutherford(): tkMessageBox.showinfo("hello world", j) def N(): tkMessageBox.showinfo("Variable N", "Number of alpha particles incident on foil") def T(): tkMessageBox.showinfo('Variable t', 'Thickness of foil in metres') def K(): tkMessageBox.showinfo('Variable E', 'Kinetic energy of alpha particles in joules') def atom(): tkMessageBox.showinfo('Variable Z', 'Atomic number of element from which the foil is made, or the name of the element') class App: def __init__(self, master): frame = Frame(master) #creates the first frame Button(frame, text = "?", command=N).grid(row=1,column=2) #various help buttons Button(frame, text = "?", command=T).grid(row=2,column=2) Button(frame, text = "?", command=K).grid(row=3,column=2) Button(frame, text = "?", command=atom).grid(row=4,column=2) Nlabel = Label(frame, text = "N =").grid(row=1, column=0, sticky=E) #labels next to the entry frame tlabel = Label(frame, text="t =").grid(row=2,column=0, sticky=E) Elabel = Label(frame, text="E =").grid(row=3,column=0, sticky=E) Zlabel = Label(frame, text="Z =").grid(row=4, column=0, sticky=E) eN=Entry(frame) eN.grid(row=1,column=1) et=Entry(frame) et.grid(row=2,column=1) eE=Entry(frame) eE.grid(row=3,column=1) eZ=Entry(frame) eZ.grid(row=4,column=1) def flup(): #the plot N=float(eN.get())#turn string into float t=float(et.get()) E=float(eE.get()) Z=float(eZ.get()) r=10*(10**-10) e=1.602*(10**-19) a=5*(10**30) i = linspace(math.pi/80, math.pi, 1000) list =[] for p in i: b = (N*a*t)/(16.0*(r**2)) c = ((2.0*Z*(e**2))/(E*4.0*math.pi*8.854*(10**-12)))**2 d = (1.0/(math.sin(p/2.0)))**4 n=b*c*d list.append(n) f=Figure(figsize=(5,4), dpi=100) g=f.add_subplot(1,1,1) g.plot(i,list) canvas=FigureCanvasTkAgg(f, master=master) canvas.show() canvas.get_tk_widget().pack(side=LEFT, fill=BOTH, expand=1) canvas._tkcanvas.pack(side=TOP, fill=BOTH, expand=1) #def clear(): bgra=Button(frame, text = "Plot", command=flup) #this button makes the plot bgra.grid(row=5,column=1) delete=Button(frame,text='Clear All', command=clear) delete.grid(row=5,column=2) frame2=Frame(master) b1=Button(frame2, text="Rutherford Scattering??", command=rutherford) b1.pack(side=LEFT) frame2.pack() frame.pack() root = Tk() app = App(root) root.mainloop() 

Para eliminar todo en un canvas, llame al método de delete con un argumento de "all" . No sé nada acerca de matplotlib, pero supongo que harías algo como esto:

 canvas.get_tk_widget().delete("all")