Re: Creating dynamic window

John Henry <[email protected]>
Newsgroups gmane.comp.python.pythoncard
Message-ID <[email protected]>
No dice.  Here's what I have:

def mouseclick_factory(parent, name):
    def function(self, event):
        print "You clicked '%s'." % name
    function.name = "on_%s_mouseClick" % name
    method = new.instancemethod(function, parent,
parent.__class__)
    setattr(parent, function.name, method)
    parent._addHandler(method)
    parent.components[name] = {'type':'Button',
                                 'name':name,
                                 'label':name,
                                 'position':(5,
5+int(name[-1:])*30),
                                 'text':name}
    return function

class Minimal(model.Background):
    def on_initialize(self, event):
        self.components['field1'] =
{'type':'TextField','name':'field1','position':(5,
5),'size':(150, -1),'text':'Hello PythonCard'}
        mouseclick_factory(self, "Button1")

if __name__ == '__main__':
    app = model.Application(Minimal, None, rsrc)
    app.MainLoop()


When I click on Button1, nothing happens.



--- Kevin Altis <[email protected]> wrote:

> 
> On Jun 23, 2007, at 12:36 PM, John Henry wrote:
> 
> > There are people at the Python newsgroup
> suggesting
> > that I should avoid using exec to accomplish this.
> > Here's what they suggested:
> >
> 
> ...
> 
> >         function = mouseclick_factory(self, name)
> # as
> > before
> >         method = new.instancemethod(function,
> self,
> > self.__class__)
> >         setattr(self, function.name, method)
> 
> ...
> 
> You're basically doing what addMethod does, so after
> the setattr  
> call, try
> 
> self._addHandler(method)
> 
> As mentioned before you're going to have to create
> the component  
> after the event handler is created and bound or its
> bind events  
> "magic" won't happen correctly. That means this bit
> in your factory  
> needs to be moved out and after the _addHandler
> call.
> 
>      parent.components[name] = {'type':'Button',
>                                   'name':name,
>                                   'label':name,
>                                   'position':(5,
> 5+id_num*30),
>                                   'text':name}
> 
> The way the PythonCard event binding works now is
> more efficient as I  
> said but it is faster in part because of the caching
> of event handler  
> names which is what the call to _addHandler is
> doing. You can see all  
> this code in model.py. The handler name is added to
> a simple  
> dictionary used for lookups by the findHandler
> method. In the old  
> system, there was a lot of looping done at event
> dispatch time to  
> find the right handler, back when everything was
> dynamic, but when I  
> streamlined the code, I kept the old strategy, but
> simply moved it  
> into a one-time event binding when a component is
> created.
> 
> > Unfortunately, it doesn't work.  PythonCard
> doesn't
> > calll the fuction created by the
> mouseclick_factory.
> > However, if I place the following statement right
> > after the setattr call, it works (proving that the
> > function actually gets created).
> >
> >         self.on_Button1_mouseClick(event)
> >
> > Any idea why this doesn't work?
> >
> > Thanks,
> >
> > --
> > John Henry
> 
> ka
> 
>
-------------------------------------------------------------------------
> This SF.net email is sponsored by DB2 Express
> Download DB2 Express C - the FREE version of DB2
> express and take
> control of your XML. No limits. Just data. Click to
> get it now.
> http://sourceforge.net/powerbar/db2/
> _______________________________________________
> Pythoncard-users mailing list
> [email protected]
>
https://lists.sourceforge.net/lists/listinfo/pythoncard-users
> 


--
John Henry

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.