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