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