AH HA!

Showing 1-1 of 1 messages
AH HA! margrave 9/13/12 5:57 PM
Communicating between classes?

This seems to be a thorny problem in pyjs because some Python structures work...  Some produce unexpected results.

Anyway, I solved the last two problems I posted with some horrid kludge, which pyjs handles very well indeed.

I hacked up the OnClickTest.py Example to this:

from pyjamas.ui.SimplePanel import SimplePanel
from pyjamas.ui.VerticalPanel import VerticalPanel
from pyjamas.ui.HorizontalPanel import HorizontalPanel
from pyjamas.ui.Button import Button
from pyjamas.ui.RootPanel import RootPanel
from pyjamas import Window
import single

A=single

def onButtonClick(sender):
    Window.alert("function called")

class Object(object):
    pass

class OnClickTest(HorizontalPanel):
   
    def __init__(self):
        HorizontalPanel.__init__(self)
        def localFunc(sender):
            Window.alert("anon object + local func called")
        obj = Object()
        setattr(obj, 'onClick', localFunc)
        self.b = Button("function callback", onButtonClick)
        self.b2 = Button("object callback", self)
        self.b3 = Button("anon object + local func callback", obj)
        A.buttons=[self.b, self.b2, self.b3]

       
        self.add(self.b)
        self.add(self.b2)
        self.add(self.b3)

    def onClick(self, sender):
        Window.alert("object called")

class George(VerticalPanel):
    def __init__(self):
        VerticalPanel.__init__(self)
        self.bx = A.buttons[0]
        self.by = A.buttons[2]
        self.bz = A.buttons[1]
        self.add(self.bx)
        self.add(self.by)
        self.add(self.bz)

def main():
    root=RootPanel()
    v = VerticalPanel()
    keep = OnClickTest()
    v.add(keep)
    g = George()
    v.add(g)
    root.add(v)
    A.buttons[1].setEnabled(False)
   

if __name__ == '__main__':
    main()


It works if you build it, but the three buttons are vertical and the third button down is greyed out.   

I was truly frightened of what something like


class Single(object): 
     """This is a singleton class definition, one instance"""
     _inst = None
     def __new__(cls, *args, **kwargs):
         if cls._inst is not None:
             return cls._inst
         cls._inst = object.__new__(cls, *args, **kwargs)
         return cls._inst


class Borg(object):
    """This can have multiple instances, but all share the same state"""
    _state = {}
    def __new__(cls, *p, **k):
        self = object.__new__(cls)
        self.__dict__ = cls._state
        return self

    def __init__(self, *args, **kw):
        """ Room to code here"""
        pass

might do with pyjs, so I used something much, much simpler.

IN the onclicktest/ directory I did

$ touch single.py

and then imported that.  It works wonderfully as a singleton(global variable keeper).

Michael