Tkinter default bindings

P

Phil Schmidt

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.
 
M

Martin Franklin

Phil said:
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,020
Latest member
GenesisGai

Latest Threads

Top