oval
Peter Otten
__peter__ at web.de
Sun Dec 4 09:54:47 EST 2005
Ben Bush wrote:
> On 12/4/05, Diez B. Roggisch <deets at nospam.web.de> 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
More information about the Python-list
mailing list