|
From: John H. <ec...@ya...> - 2007-06-24 21:00:17
|
Okay, here's a version that works, clean, and not
requiring any changes to PythonCard.
#!/usr/bin/python
"""
__version__ = "$Revision: 1.6 $"
__date__ = "$Date: 2004/08/17 19:46:06 $"
"""
import new
from PythonCard import log
from PythonCard import model
from PythonCard.model import SetInitParam
rsrc = {'application':{'type':'Application',
'name':'Minimal',
'backgrounds': [
{'type':'Background',
'name':'bgMin',
'title':'Minimal PythonCard Application',
'size':(200, 300),
'components': [
] # end components
} # end background
] # end backgrounds
} }
class Background_Dynamic(model.Background):
def __init__(self, aParent, aBgRsrc,
SetInitParamFct=SetInitParam):
model.Background.__init__(self, aParent,
aBgRsrc, SetInitParamFct)
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
def mouseclick_factory(self, name):
def function(self, background, event):
self.mouseclick_factory("Button"+str(int(name[-1:])+1))
function.name = "on_%s_mouseClick" % name
method = new.instancemethod(function, self,
self.__class__)
setattr(self, function.name, method)
self.addHandler(method)
self.components[name] = {'type':'Button',
'name':name,
'label':name,
'position':(5,
5+int(name[-1:])*30),
'text':name}
return function
class Minimal(Background_Dynamic):
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")
if __name__ == '__main__':
app = model.Application(Minimal, None, rsrc)
app.MainLoop()
--- 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
|