oval

B

Ben Bush

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:
print "oval1 got hit!"
else:
print "oval2 got hit"
canvas.tag_bind('oval1','<Button>',func=myEvent)
canvas.tag_bind('oval2','<Button>',func=myEvent)
root.mainloop()
 
D

Diez B. Roggisch

Ben said:
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.


Regards,

Diez
 
B

Ben Bush

Ben said:
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'
 
P

Peter Otten

Ben said:
Ben said:
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
 
D

Diez B. Roggisch

got AttributeError: Event instance has no attribute 'source'

As I said: I don'k _know_ how event actually looks like,a s I'm not a
Tkinter-expert, but I've had plenty of projects involving other
GUI-Toolkits, which work all the same in this manner. After all the
whole purposs of the event parameter is to inform you about the cause
for that event - in this case the pressing of a MB on a specific canvas
element.

But if you'd take it on you to consult the documentation as I asked you
to do, I'm pretty sure you find the proper attribute.


Regards,

Diez
 
B

Ben Bush

As I said: I don'k _know_ how event actually looks like,a s I'm not a
Tkinter-expert, but I've had plenty of projects involving other
GUI-Toolkits, which work all the same in this manner. After all the
whole purposs of the event parameter is to inform you about the cause
for that event - in this case the pressing of a MB on a specific canvas
element.

But if you'd take it on you to consult the documentation as I asked you
to do, I'm pretty sure you find the proper attribute.


Regards,

Diez
thanks anyway. The python manual for event is very brief and it is
hard for me to understand.
 
B

Ben Bush

Ben said:
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
Peter,
It works. Thanks!
is there any good material to read if I want to improve my
understanding of working on interactive ways of dealing with shapes
on the TKinter?
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,062
Latest member
OrderKetozenseACV

Latest Threads

Top