Tkinter default bindings

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Phil Schmidt

    Tkinter default bindings

    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.unbi nd('<Key>')
    self.entry.even t_generate('<Ke y>',
    keycode=e.keyco de,
    keysym=e.keysym ,
    )
    self.entry.bind ('<Key>', self.a_key)
    self.top.bind(' <Key>', self._parent_cl ass__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.
  • Martin Franklin

    #2
    Re: Tkinter default bindings

    Phil Schmidt wrote:[color=blue]
    > 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.unbi nd('<Key>')
    > self.entry.even t_generate('<Ke y>',
    > keycode=e.keyco de,
    > keysym=e.keysym ,
    > )
    > self.entry.bind ('<Key>', self.a_key)
    > self.top.bind(' <Key>', self._parent_cl ass__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.[/color]

    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_f ocus:
    print "the entry binding"
    return "break"
    else:
    print "the frame binding"


    Martin

    Comment

    Working...