Ben Bush wrote: > On 12/4/05, Diez B. Roggisch <[EMAIL PROTECTED]> wrote: >> Ben Bush wrote: >> > I tested the following code and wanted to get the message of "oval2 >> > got hit" if I click the red one. But I always got "oval1 got hit". >> > from Tkinter import * >> > root=Tk() >> > canvas=Canvas(root,width=100,height=100) >> > canvas.pack() >> > a=canvas.create_oval(10,10,20,20,tags='oval1',fill='blue') >> > b=canvas.create_oval(50,50,80,80,tags='oval2',fill='red') >> > def myEvent(event): >> > if a: >> >> Here is your problem. a is a name, bound to some value. So - it is true, >> as python semantics are that way. It would not be true if it was e.g. >> >> False, [], {}, None, "" >> >> >> What you want instead is something like >> >> if event.source == a: >> ... >> >> Please note that I don't know what event actually looks like in Tkinter, >> so check the docs what actually gets passed to you. > > got AttributeError: Event instance has no attribute 'source'
Note that Diez said /something/ /like/ /event.source/. The source is actually called widget -- but that doesn't help as it denotes the canvas as a whole, not the individual shape. The following should work if you want one handler for all shapes: def handler(event): print event.widget.gettags("current")[0], "got hit" canvas.tag_bind('oval1', '<Button>', handler) canvas.tag_bind('oval2', '<Button>', handler) I prefer one handler per shape: def make_handler(message): def handler(event): print message return handler canvas.tag_bind('oval1', '<Button>', make_handler("oval 1 got hit")) canvas.tag_bind('oval2', '<Button>', make_handler("oval 2 got hit")) Peter -- http://mail.python.org/mailman/listinfo/python-list