On Sun, 30 Jan 2005, Glen wrote:
> As a Python/Tkinter newbie, I thought I was getting on ok...
> then I hit this problem.
>
> I have a canvas (c1)
> A group of objects are drawn on c1 and given a tag
> c1.addtag_all('group_A')
> Another group of objects are drawn, I wish to tag these 'group_B'.
Hi Glen,
Ok, so you're looking for something like a hypothetical "find_withouttag"
to define 'group_B' then. I don't think such a function exists directly,
but we can make it up.
> At the moment I 'get by' with...
>
> a=c1.find_withtag('group_A')
> b=c1.find_all()
> c=b[len(a):]
> for i in range(len(c)):
> c1.addtag_above('group_B',len(a)+i)
There's one problem here: the system doesn't guarantee that all the
'group_A' elememts will end up at the beginning of 'b', so there's a very
strong possibility of tagging the wrong elements here.
I think that getting this right will take some more work. Here's a
definition of a function called find_withouttag():
###
def find_withouttag(canvas, tag):
"""Returns all the objects that aren't tagged with 'tag'."""
all_objects = canvas.find_all()
tagged_objects = canvas.find_withtag(tag)
return subtract_instances(all_objects, tagged_objects)
def subtract_instances(l1, l2):
"""Returns a list of all the object instances in l1 that aren't in
l2."""
identity_dict = {}
for x in l1:
identity_dict[id(x)] = x
for x in l2:
if id(x) in identity_dict:
del identity_dict[id(x)]
return identity_dict.values()
###
[Side note to other: the work that subtract_instances() does is similar to
what IdentityHashMap does in Java: does anyone know if there's already an
equivalent dictionary implementation of IdentityHashMap in Python?]
We can see how subtract_instances() works on a simple example:
###
>>> class MyClass:
... def __init__(self, name):
... self.name = name
... def __repr__(self):
... return str(self.name)
...
>>> frodo, elrond, arwen, aragorn, sam, gimli = (
... map(MyClass, "Frodo Elrond Arwen Aragorn Sam Gimli".split()))
>>> hobbits = frodo, sam
>>> everyone = frodo, elrond, arwen, aragorn, sam, gimli
>>>
>>> subtract_instances(everyone, hobbits)
[Arwen, Aragorn, Gimli, Elrond]
###
This subtract_instances() function should do the trick with instances of
the canvas items. There's probably a simpler way to do this --- and there
are things we can do to make it more efficient --- but I have to go to
sleep at the moment. *grin*
Best of wishes to you!
_______________________________________________
Tutor maillist - [email protected]
http://mail.python.org/mailman/listinfo/tutor