Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Tkinter: a problem with propagating an event handler of a canvas

230 views
Skip to first unread message

Daneel Yaitskov

unread,
Apr 30, 2010, 5:56:54 AM4/30/10
to
Hi


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

rtfm_rtfm_rtfm.vcf

Daneel Yaitskov

unread,
Apr 30, 2010, 7:06:29 AM4/30/10
to
Daneel Yaitskov wrote:
>
> There is simple logic and OOP can prank the solution.
>

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

rtfm_rtfm_rtfm.vcf
0 new messages