Root panel listener is the way to do it. On Fri, Aug 31, 2012 at 9:50 PM, Mark W. Andrews <[email protected]>wrote:
> 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) > > > > -- > > > > --
