[wxruby-users] key press event

Alex Fenton alex at pressure.to
Tue Jun 16 07:55:12 EDT 2009


Hi Brad

Brad Montgomery wrote:
> I got the code to work if I connected the event handler to a Wx::Panel,
> but that will not solve the problem.
> When the event handler is connected to the panel and the user touches 
> another
> widget on the screen that widget will now have focus and the panel will 
> no
> longer receive the key press events.
>   

By default, only events that are CommandEvents (those associated with 
defined actions on controls, like clicking a button, typing text in a 
TextCtrl) propagate up the window hierarchy to the parent. Other types 
of events, such as MouseEvents and KeyEvents are only received by the 
window/widget that currently has focus. So if you have a Panel on top of 
a Frame, once the Panel child has had the event, it won't propagate further.

http://wxruby.rubyforge.org/doc/eventhandlingoverview.html
> I need the event handler connected to the Frame/Window and listen for 
> event
> even if it does not have focus.
> I am reading from a bar code scanner that sends the data as keyboard 
> input.
>   

The above normally makes sense for interaction, but I can see it's a bit 
inconvenient for this less usual situation. There are various ways you 
could work round this. If you have only a single frame receiving data, 
and a small number of windows within it, you could capture the key press 
event on all of them, and then manipulate the received event's 
propagation level with methods like resume_propagation. See this python 
example:

http://wiki.wxpython.org/index.cgi/EventPropagation

If the bar code data is such that it is represented by only a small 
number of different possible keys you could try using an 
acceleratortable, which directs all key presses within a frame to menu items

http://wxruby.rubyforge.org/doc/acceleratortable.html
http://osdir.com/ml/lang.ruby.wxruby.user/2008-06/msg00036.html

hth
alex






More information about the wxruby-users mailing list