That is not the best way to interact classes with each other. The best solution would be to make the Face object in the canvas class like this:
from tkinter import * class Button_Can(Frame): def __init__(self): Frame.__init__(self) self.larg,self.haut=200,200 self.can=Canvas(self.master,width=self.larg,height=self.haut,bg='ivory') self.can.pack() self.face = Face(self.can) self.b1=Button(self.master,text='Open it !',command=self.face.openMouth) self.b2=Button(self.master,text='Close it !',command=self.face.closeMouth) self.b1.pack(side=RIGHT) self.b2.pack(side=LEFT) class Face(): def __init__(self, can): self.can = can self.setup() def setup(self): self.can.delete(ALL) cc =[[100, 100, 80, 'red'],[70, 70, 15, 'blue'], [130, 70, 15, 'blue'],[70, 70, 5, 'black'], [130, 70, 5, 'black'],[44, 115, 20, 'red'], [156, 115, 20, 'red'],[100, 95, 15, 'purple']] i =0 while i < len(cc): el = cc[i] self.circle(el[0], el[1], el[2], el[3]) i += 1 self.opened_mouth = None self.closed_mouth = None def circle(self,x, y, r, coul ='black'): "Draw a circle center x,y radius r " self.can.create_oval(x-r, y-r, x+r, y+r, outline=coul) def openMouth(self): #self.can.delete(self.closed_mouth) self.setup() self.opened_mouth=self.circle(100, 145, 30, 'purple') def closeMouth(self): #self.can.delete(self.opened_mouth) self.setup() self.closed_mouth=self.can.create_line(80,145,120,145,fill='purple') root = Tk() A=Button_Can() B=Face(A.can) root.mainloop()NOTE: I am more use to pygame's redraw everything style... every frame, so i am not sure if tkinter has a method to just delete a portion of the canvas or not. So i just redrew everything.
Recommended Tutorials: