Destructor Woes, was Advice needed on __del__

phil phillip.watts at anvilcom.com
Tue May 10 13:21:39 EDT 2005


> Then i got a tip that you can register a function that needs to be 
> called when the object is going to be deleted.
> For instance to register a function __exit, you do this:
> 


Here is the complete line class with your suggestion:

Below is the output.

Nice idea, maybe I did something wrong?

class line:
	def __init__(s,glob,argl,color=''):
	    atexit.register(s.__exit)
	    s.glob = glob
	    s.type = 'line'
	    s.color = color
	    if not s.color: s.color = glob.color
	    if len(argl) == 2:
	        wobj = glob.objs[ argl[0] ][0]
	        s.x0 = a0 = wobj.x
	        s.y0 = b0 = wobj.y
	        wobj = glob.objs[ argl[1] ][0]
	        s.x1 = a1 = wobj.x
	        s.y1 = b1 = wobj.y

	    elif len(argl) == 4:
	        s.x0 = a0 = float( argl[0] )
	        s.y0 = b0 = float( argl[1] )
	        s.x1 = a1 = float( argl[2] )
	        s.y1 = b1 = float( argl[3] )
	    else: return
	    s.midx = (s.x0 + s.x1) / 2
	    s.midy = (s.y0 + s.y1) / 2
	    s.len = sqrt( (s.x1 -s.x0)**2  + (s.y1 -s.y0)**2 )
	    if  (s.y1 -s.y0) == 0: s.slope = 0
	    elif  (s.x1 -s.x0) == 0: s.slope = 999999
	    else: s.slope = (  (s.y1 -s.y0) / (s.x1 -s.x0) )

	    # center point of graph is 400,300
	    # scale is no of pixels per unit of measure
             x0 = a0  * s.glob.scale + 400
             y0 = 300 - b0  * s.glob.scale
             x1 = a1  * s.glob.scale + 400
             y1 = 300 - b1 * s.glob.scale
	    s.obj = glob.can.create_line(x0,y0,x1,y1,
					width=glob.width,fill=s.color)
	def __exit(s):
	    print 'exit'
	    s.glob.can.delete(s.obj)

	# def __del__(s):
	#     s.glob.can.delete(s.obj)


exit

Error in sys.exitfunc:
Traceback (most recent call last):
   File "/usr/local/lib/python2.3/atexit.py", line 20, in _run_exitfuncs
     func(*targs, **kargs)
   File "./graph.py", line 972, in __exit
     s.glob.can.delete(s.obj)
   File "/usr/local/lib/python2.3/lib-tk/Tkinter.py", line 2085, in delete
     self.tk.call((self._w, 'delete') + args)
_tkinter.TclError: invalid command name ".1076354284"




More information about the Python-list mailing list