More On - deepcopy, Tkinter

phil phillip.watts at anvilcom.com
Tue Jul 5 09:48:53 EDT 2005


I posted the following yesterday and got no response
and did some testing simplifying the circumstances
and it appears that deepcopy fails when the object
to be copied contains a reference to a Canvas Object.
Perhaps any Tkinter object, didn't get that far.

The problem arises because I have a geometry tutorial
with a progression of drawings and want the students to
be able to go "back".  Creating "snapshots" of points
in time in the tutorial makes a clean and elegant solution
possible.  Other solutions I am trying to come up with are
very messy.

It is frustrating to think that in a language like python
there might be things which you can't make a copy of.
That is bizarre enough to wonder about a deep flaw or
hopefully I'm just doing something very wrong.

Any ideas appreciated.

phil wrote:

> I wrote the following to prove to myself that
> deepcopy would copy an entire dictionary
> which contains an instance of a class to
> one key of another dictionary.
> Note that after copying adict to ndict['x']
> I delete adict.
> Then ndict['x'] contains a good copy of adict.
> works great.
> 
> 
> class aclass:
>      def __init__(s):
> 	s.anint = 123
> aninstance = aclass()
> adict = {}
> adict['y'] = aninstance
> 
> ndict = {}
> ndict['x'] =  copy.deepcopy(adict)
> del adict
> print ndict
> print ndict['x']['y']
> print ndict['x']['y'].anint # this line prints 123
> print
> 
> Then in the following code when I try to deepcopy
> s.glob.objs I get following error
> Note that s.glob.objs is a dictionary and I am
> attempting to copy to a key of s.save, another dict,
> just like above.
> ??????????
> s.glob.objs may have several keys, the data for each
> will be instance of classes like line and circle.
> Those instances will have tkinter canvas objects in them.
> 
> class Graph:
>      def __init__(s):
>          class DummyClass: pass
>          s.glob = DummyClass()
>          s.glob.objs = {}
>          .. # here add some instance of objects like
>          .. # circles and lines to s.glob.objs
>          # instantiate dialog
>          s.DI = dialog(s.glob)
> 
>      class dialog:
>          def __init__(s,glob):
>              s.glob = glob
>              s.save = {}
> 
>          def proc(s):
>              cur = someint
>              s.save[cur] = copy.deepcopy(s.glob.objs)
> 
> Exception in Tkinter callback
> Traceback (most recent call last):
>    File "/usr/local/lib/python2.3/lib-tk/Tkinter.py", line 1345, in __call__
>      return self.func(*args)
>    File "/home/phil/geo/g.py", line 303, in enter
>      else:s.proc()
>    File "/home/phil/geo/g.py", line 245, in proc
>      s.save[cur][k] = copy.deepcopy(s.glob.objs[k][0])
>    File "/usr/local/lib/python2.3/copy.py", line 179, in deepcopy
>      y = copier(x, memo)
>    File "/usr/local/lib/python2.3/copy.py", line 307, in _deepcopy_inst
>      state = deepcopy(state, memo)
>    File "/usr/local/lib/python2.3/copy.py", line 179, in deepcopy
>      y = copier(x, memo)
>    File "/usr/local/lib/python2.3/copy.py", line 270, in _deepcopy_dict
>      y[deepcopy(key, memo)] = deepcopy(value, memo)
>    File "/usr/local/lib/python2.3/copy.py", line 179, in deepcopy
>      y = copier(x, memo)
>    File "/usr/local/lib/python2.3/copy.py", line 307, in _deepcopy_inst
>      state = deepcopy(state, memo)
>    File "/usr/local/lib/python2.3/copy.py", line 179, in deepcopy
>      y = copier(x, memo)
>    File "/usr/local/lib/python2.3/copy.py", line 270, in _deepcopy_dict
>      y[deepcopy(key, memo)] = deepcopy(value, memo)
>    File "/usr/local/lib/python2.3/copy.py", line 206, in deepcopy
>      y = _reconstruct(x, rv, 1, memo)
>    File "/usr/local/lib/python2.3/copy.py", line 338, in _reconstruct
>      y = callable(*args)
>    File "/usr/local/lib/python2.3/copy_reg.py", line 92, in __newobj__
>      return cls.__new__(cls, *args)
> TypeError: function() takes at least 2 arguments (0 given)
> 
> 






More information about the Python-list mailing list