[python-win32] gui inheritance? clumsy com inheritance?
Tim Newsham
newsham at lava.net
Sat Jun 24 01:07:02 CEST 2006
I have two comments.
First, it appears that the GUI object elements are hidden. I can create
the objects through a CreateName() function, but I cannot otherwise access
the objects (take PyCToolBarCtrl for example). It would often be useful
to be able to subclass an object (rather than simply wrap it in another
class). Is there a reason this isn't supported?
Second, it appears that I have to manually keep track of a lot of
settings when building a COM class. It would be much easier if
the system automatically accumulated some of these settings during
inheritance. As an example, when I inherit a class with a
_public_methods_ setting, I should get all of those methods in the
new class. Using metaclasses it is possible to have the system
do this automatically for you. Is there a reason this hasn't been
done yet? Below is a simple example that accumulates several fields,
including a new _iid_ field that I invented to simplify my code.
I definitely overlooked some fields; a more complete implementation
would have to handle attributes for example.
class _COMMeta(type) :
"""
This metaclass will walk all the supers and pull out all the
win32com metadata and compose it in the new object. This
makes inheritance work how you would expect it to.
base._iid_ is accumulated into _com_interfaces_.
base._public_methods_ is accumulated.
base._com_interfaces_ is accumualted.
"""
def __new__(cls, name, bases, dict) :
def inheritVals(vs, n) :
if n not in dict :
dict[n] = []
for v in vs :
if v not in dict[n] :
dict[n].append(v)
def inheritBaseList(b, n) :
inheritVals(getattr(b, n, []), n)
def inheritBaseVal(b, n, ln) :
if hasattr(b, n) :
inheritVals([getattr(b, n)], ln)
for b in bases :
inheritBaseVal(b, '_iid_', '_com_interfaces_')
inheritBaseList(b, '_com_interfaces_')
inheritBaseList(b, '_public_methods_')
return type.__new__(cls, name, bases, dict)
class COM(object) :
__metaclass__ = _COMMeta
# the following clases make use of inheritance to simplify
# specification...
class IOleWindow(COM) :
_public_methods_ = ['GetWindow', 'ContextSensitiveHelp']
class IDockingWindow(IOleWindow) :
_public_methods_ = ['CloseDW', 'ResizeBorderDW', 'ShowDW']
class IDeskBand(IDockingWindow) :
_iid_ = _shell.IID_IDeskBand
_public_methods_ = ['GetBandInfo']
Tim Newsham
http://www.lava.net/~newsham/
More information about the Python-win32
mailing list