P
phil
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.
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.
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
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)