Tkinter default bindings
Martin Franklin
mfranklin1 at gatwick.westerngeco.slb.com
Tue Mar 2 00:28:59 EST 2004
Phil Schmidt wrote:
> I have an Entry widget inside a Frame. The Frame contains other
> widgets as well. I have bound the <Key> event to the Frame, but I
> don't want the Frame to receive the event when the Entry widget has
> focus.
>
> So, I bound the <Key> event to the Entry widget (bound to method
> a_key()). This works, except that both the Entry and Frame widgets get
> the event. This also forces me to implement event handlers, which is
> fine for the Frame since that's what I want to do. But I want the
> Entry to use its default handler, not my own handler. Rather than
> duplicate all that functionality, I found I could accomplish this by
> temporarily unbinding the events, re-generating the event, and then
> re-binding the events, as follows:
>
> def a_key(self, e):
> self.top.unbind('<Key>')
> self.entry.unbind('<Key>')
> self.entry.event_generate('<Key>',
> keycode=e.keycode,
> keysym=e.keysym,
> )
> self.entry.bind('<Key>', self.a_key)
> self.top.bind('<Key>', self._parent_class__keypress)
> return 'break'
>
> This works, but it's kludgy. Is there a better way to do this? I just
> want the Entry widget to receive the event when it has focus, behave
> in its default manner, and not have the event propagate upward to
> containing widgets.
You could just find out who has focus (root.focus_get() and compare with
the entry... something like (untested)
def a_key(self, event):
has_focus = root.focus_get()
if theEntry==has_focus:
print "the entry binding"
return "break"
else:
print "the frame binding"
Martin
More information about the Python-list
mailing list