A event handler can disable call other handler for current event
returning "break" string.
But this feature doesn't work into elements' event handlers of a Canvas.
For example <Double-1> event handler of a Canvas is always called. Even
if <Double-1> event handler of Canvas's text element is called.
The following snipped code behaves itself not so I want.
After "Got object click" the program prints "Got canvas click".
My aim is to reach the program prints only first message.
Does Tkinter library have any standard solution of this task?
def onCanvasClick(event):
print 'Got canvas click', event.x, event.y, event.widget
def onObjectClick(event):
print 'Got object click', event.x, event.y, event.widget,
print event.widget.find_closest(event.x, event.y)
return "break"
root = Tk()
canv = Canvas(root, width=100, height=100)
obj1 = canv.create_text(50, 30, text='Click me one')
canv.bind('<Double-1>', onCanvasClick) canvas
canv.tag_bind(obj1, '<Double-1>', onObjectClick,add='')
Manually I can make this so:
To link with a canvas flag variable. Element's event handle will set
this variable. And canvas's event handler will check it and act itself
only if the flag is reset. After checking flag the handler always resets it.
There is simple logic and OOP can prank the solution.
svar = True
def onCanvasClick(event):
global svar
if svar:
print 'Got canvas click', event.x, event.y, event.widget
svar = True
def onObjectClick(event):
global svar
svar = False
print 'Got object click', event.x, event.y, event.widget,
print event.widget.find_closest(event.x, event.y)
root = Tk()
canv = Canvas(root, width=100, height=100)
obj1 = canv.create_text(50, 30, text='Click me one')
canv.bind('<Double-1>', onCanvasClick) s
canv.tag_bind(obj1, '<Double-1>', onObjectClick,add='')
Daneel Yaitskov
The result of my try to improve my last idea with OOP techniks:
class MyCanvas (Canvas):
def __init__(self,master = None, cnf = {}, bg = '#fff' ):
Canvas.__init__(self, master= master, cnf = cnf, bg = bg)
self.tagOrId_Event_mask = {}
def tag_bind(self,tagOrId, sequence = None, func = None, add =
None, blockCanvasHandler = True):
if blockCanvasHandler:
print "tag_bind: " + str (sequence)
id = str(sequence) #+ str(func)
self.tagOrId_Event_mask[ id ] = True
def wrap(e):
self.tagOrId_Event_mask[ id ] = False
return func( e )
Canvas.tag_bind(self,tagOrId, sequence, wrap, add)
else:
Canvas.tag_bind(self,tagOrId, sequence, func, add)
def bind(self, sequence = None, func = None, add = None):
print "bind: " + str (sequence)
id = str(sequence) # + str(func)
if id not in self.tagOrId_Event_mask:
self.tagOrId_Event_mask[ id ] = None
def wrap(e):
if self.tagOrId_Event_mask[id]:
return func(e)
self.tagOrId_Event_mask[id] = True
Canvas.bind(self,sequence, wrap, add)
This class need unbind yet.
Daneel Yaitskov