Hi,
(I am new to pyjamas, and this group. Many thanks to all those who
developed pyjamas, it seems perfect for what I need!)
In one of the applications I am working on, I would like to listen for
keypress events. As a trivial example, a html panel might display a word
and then if a key is pressed, it would display another word, and so on. I
have found this a bit more difficult than I initially envisaged as doing
the same thing with mouse clicks is easy. I presume the reason for the
difference is something to do with keyboard focus, but I am not sure I
fully get the big picture.
As part of my learning, I have written two pieces of code to display words
one after the other like in my trivial example just mentioned. One works
with clicks, the other with key presses. The clicky one was simple, but the
pressy one, although it works, strikes me as unnecessarily convoluted. It
uses a "root panel listener" object that I ripped off from the
ClickableRootPanel.py example. I have included the code below.
In general, is it possible to get an e,g. HTML panel to listen to and act
on a key press? If so, how is this done? My attempts at adding a key
listener, in analogy with adding a click listener in the first piece below,
did not work at all?
I am sure my root panel listener approach is unnecessary, but I am stumped
as to what to try next.
Any insights or advice would be most appreciated.
-Mark
# this displays words from a sentence,
# one word at a time, moving with each click.
# tested in FF and Chrome
from pyjamas.ui.ClickListener import ClickHandler
from pyjamas.ui.HTMLPanel import HTMLPanel
from pyjamas.ui.RootPanel import RootPanel
class SentenceBox(HTMLPanel,ClickHandler):
def __init__(self,text='a b c'):
HTMLPanel.__init__(self,"")
ClickHandler.__init__(self)
self.addClickListener(self)
self.sentence = text.split()
self.n = len(self.sentence)
self.i = 0
self.setHTML(self.sentence[self.i])
def onClick(self, sender):
self.i += 1
word = self.sentence[self.i % self.n]
self.setHTML(word)
if __name__ == "__main__":
sentence = 'In the bed of the river there were pebbles and boulders.'
RootPanel().add(SentenceBox(text=sentence))
####### END SCRIPT #######
# To do the same thing as above, but moving on with
# key press event led to this. It seems rube goldberg to me.
from pyjamas.ui.FocusPanel import FocusPanel
from pyjamas.ui.HTMLPanel import HTMLPanel
from pyjamas.ui.RootPanel import RootPanelCls, RootPanel, manageRootPanel
from pyjamas.ui.Button import Button
from pyjamas.ui.KeyboardListener import KeyboardHandler
from pyjamas.ui.ClickListener import ClickHandler
from pyjamas.ui.HTML import HTML
from pyjamas import Window
from pyjamas import DOM
class RootPanelListener(RootPanelCls, KeyboardHandler, ClickHandler):
def __init__(self, Parent, sentencebox, *args, **kwargs):
self.Parent = Parent
self.focussed = True
RootPanelCls.__init__(self, *args, **kwargs)
ClickHandler.__init__(self)
KeyboardHandler.__init__(self)
self.addClickListener(self)
self.addKeyboardListener(self)
self.sentencebox = sentencebox
def onClick(self, Sender):
self.focussed = not self.focussed
self.Parent.setFocus(self.focussed)
def onKeyDown(self, sender, keyCode, modifiers = None):
self.sentencebox.nextword()
class SentenceBox(HTMLPanel):
def __init__(self,text='a b c'):
HTMLPanel.__init__(self,"")
self.sentence = text.split()
self.n = len(self.sentence)
self.i = 0
self.setHTML(self.sentence[self.i])
def nextword(self):
self.i += 1
word = self.sentence[self.i % self.n]
self.setHTML(word)
if __name__ == '__main__':
sentence = 'In the bed of the river there were pebbles and boulders.'
mybox = SentenceBox(text=sentence)
panel = FocusPanel()
panel.add(mybox)
rootpanel = RootPanelListener(Parent = panel,sentencebox=mybox)
manageRootPanel(rootpanel)
RootPanel().add(panel)
--