[Chicago] wxpita
Feihong Hsu
hsu.feihong at yahoo.com
Sat Dec 15 19:26:33 CET 2007
As I said, I threw out the Fake Method stuff because the abstraction was too leaky. However, I do override __getattr__ for two reasons:
- Allow the user to keep using the top-level wrapper object as if it was a real widget.
- Store event binding information so that events can be bound at widget creation time
For those interested, this is the source code:
def __getattr__(self, name):
# If the widget has already been created, this wrapper object just
# acts as its proxy:
if self.widget:
return getattr(self.widget, name)
else:
return EventRecorder(self, name)
This was not the way that it worked at the time that I gave the talk. But I changed it afterwards based on the feedback I got, and I think it's easier to use now. I guess the moral of the story is: if you run out of ideas for your project, give a talk at Chipy and just steal other people's ideas.
Cheers,
Feihong
Aaron Lav <asl2 at pobox.com> wrote: On Sat, Dec 15, 2007 at 10:55:52AM -0600, sheila miguez wrote:
> On Dec 14, 2007 11:33 PM, Feihong Hsu wrote:
>
> > The fake methods just emulate simple method calls that you can make on the
> > real widgets. For example,
>
> I think Aaron had made a suggestion for forwarding methods you hadn't
> faked out yet to the real widgets. But I couldn't hear the entire
> conversation.
Apparently my message
(http://mail.python.org/pipermail/chicago/2007-December/003124.html)
came out blank: this not being heard seems to cross media boundaries,
sorry.
Anyway, the idea was to use __getattr__ (and __setattr__, if the wx
API requires it) to forward any calls which aren't part of the wxPita
API to a lazily created wx object. So __getattr__ would look something like
def __getattr__(self, attribute):
if not self._wx_obj:
self.create_wx_obj()
return getattr(self._wx_obj, attribute)
(The delegating class needs to be new-style, since __getattr__ for
classic classes gets called for all attributes, not just unknown ones.
__setattr__ would need to check for known "fake class" attributes, and
not delegate them. See http://docs.python.org/ref/attribute-access.html)
If there's a name clash between a fake object method and a wx method,
this delegator won't work, but such clashes seem likely to lead to
confusion anyway, and it'd be better to rename the fake object method.
With a simple delegator like this, it's possible for the abstraction
to leak (for example, if a wx method were to return a bound method,
it'd be bound to _wx_obj, not the fake object).
Also, since many wx objects can't be created without the wxApp object,
you'd also need to create the wxApp object as-needed in create_wx_obj().
There was also a brief discussion of how the arguments to the fake
object should be saved (string vs. dict), but that's orthogonal to
this issue.
Aaron
_______________________________________________
Chicago mailing list
Chicago at python.org
http://mail.python.org/mailman/listinfo/chicago
---------------------------------
Be a better friend, newshound, and know-it-all with Yahoo! Mobile. Try it now.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.python.org/pipermail/chicago/attachments/20071215/1c99aad6/attachment.htm
More information about the Chicago
mailing list