Sorry for my slow response and thank you for the advice.
-m
 

On Wednesday, 5 September 2012 11:52:55 UTC+1, Rich Newpol wrote:
>
> Root panel listener is the way to do it.
>
> On Fri, Aug 31, 2012 at 9:50 PM, Mark W. Andrews 
> <[email protected]<javascript:>
> > 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)
>>  
>>
>>
>>  -- 
>>  
>>  
>>  
>>
>
>

-- 



Reply via email to