From: John H. <ec...@ya...> - 2007-06-24 19:32:22
|
Thanks for the response. The code almost worked. The offending line is: function.func_name = "on_%s_mouseClick" % name which is a TypeError violation (readonly attribute). I ran into this too when I try to set method.__name__ directly. The workaround, as it seems, is to have an addHandler function (rather then the _addHandler function) that does this: def addHandler(self, aMethod): # Add the Handler to our Handler list. if aMethod.name not in self._handlers: log.debug("addHandler: " + aMethod.name) #self._handlers[aMethod.name] = event.Handler(aMethod) self._handlers[aMethod.name] = aMethod instead of this: def _addHandler(self, aMethod): # Add the Handler to our Handler list. if aMethod.__name__ not in self._handlers: log.debug("_addHandler: " + aMethod.__name__) #self._handlers[aMethod.__name__] = event.Handler(aMethod) self._handlers[aMethod.__name__] = aMethod When I call addHandler then, the code works. When I click the first button, a new button gets created. One minor puzzle though, Python passes down 3 parameters to the handler (rather then just 2). The first 2 are both the same and it's the normal "self" parameter you get with other handlers. The 3rd one is the event object. I don't know why I get "self" twice though. --- Kevin Altis <al...@se...> wrote: > After a bit of research I came up with the following > working example > which uses a slightly modified version of your > original factory. > func_name seems to be the important attribute. I was > able to use > addMethod to clean up the code a bit . > > This still doesn't solve the problem of creating an > arbitrary > function/method from a string, but that's a generic > Python problem > that I don't know the answer to rather than > something PythonCard- > specific. > > ka > --- > > from PythonCard import model > > rsrc = {'application':{'type':'Application', > 'name':'Minimal', > 'backgrounds': [ > {'type':'Background', > 'name':'bgMin', > 'title':'Minimal PythonCard Application', > 'size':(200, 100), > 'components': [ > > ] # end components > } # end background > ] # end backgrounds > } } > > 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'} > self.mouseclick_factory("Button1") > self.mouseclick_factory("Button2") > > def mouseclick_factory(self, name): > def function(self, event): > # changed to event.target.name to > verify we're getting > # the correct target when button is > clicked > print "You clicked '%s'." % > event.target.name > # func_name seems to be the magic attribute > rather than > # just setting func.name > function.func_name = "on_%s_mouseClick" % > name > self.addMethod(function) > self.components[name] = {'type':'Button', > 'name':name, > 'label':name, > > 'position':(5,5+int(name[-1:]) > *30), > 'text':name} > return function > > > if __name__ == '__main__': > app = model.Application(Minimal, None, rsrc) > app.MainLoop() > > > ------------------------------------------------------------------------- > 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 > Pyt...@li... > https://lists.sourceforge.net/lists/listinfo/pythoncard-users > -- John Henry |