[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