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