|
From: John H. <ec...@ya...> - 2011-04-01 14:53:26
|
I am happy to report that I've succeeded in Pythoncardize
the wx.SashLayoutWindow control of wxPython
using similar technique to the MDI support I reported previously. Not sure if
the screen capture attachment to this email will get stripped or not. If you
don't see the screen shot, shout and I'll try to upload that somewhere.
########## mod to model.py #######################
class Background(BackgroundBase, wx.Frame):
def __init__(self, aParent, aBgRsrc, init=None):
return BackgroundBase.__init__(self, aParent, aBgRsrc,
frameclass=wx.Frame, init=init)
class MDIChildBackground(BackgroundBase, wx.MDIChildFrame):
def __init__(self, aParent, aBgRsrc, init=None):
return BackgroundBase.__init__(self, aParent, aBgRsrc,
frameclass=wx.MDIChildFrame, init=init)
class MDIParentBackground(BackgroundBase, wx.MDIParentFrame):
def __init__(self, aParent, aBgRsrc, init=None):
return BackgroundBase.__init__(self, aParent, aBgRsrc,
frameclass=wx.MDIParentFrame, init=init)
class SashWindow(BackgroundBase, wx.SashLayoutWindow):
def __init__(self, aParent, aBgRsrc, init=None):
rsrc = resource.Resource(aBgRsrc).application.backgrounds[0]
return BackgroundBase.__init__(self, aParent, rsrc,
frameclass=wx.SashLayoutWindow, init=init)
# Dummy routine
def SetMenuBar(self, child):
return
# Dummy routine
def GetStatusBar(self):
return
########## end of mod to model.py #######################--
John Henry
----- Original Message ----
> From: John Henry <ec...@ya...>
> To: pyt...@li...
> Sent: Wed, March 9, 2011 10:08:39 AM
> Subject: Added MDI support to Pythoncard (was MDI - childwindows within a
>window)
>
> I am happy to let you know that I succeeded in adding MDI support to Pythoncard
>
> with only a few lines of modifications to the Background class in model.py
>
> I made the Background class into a BackgroundBase class, and have the
>Background
>
> class subclass from the BackgroundBase class.
>
> Then I added a MDIParentBackground and MDIChildBackground which simply force
> Background to subclass from wxMDIParentFrame and wxMDIChildFrame respectively,
>
> instead of the wx.Frame class. Once I've done that, wxPython does the rest
>of
>
> the work.
>
> ################ mod to model.py ######################
>
> from wxPython.wx import wxMDIParentFrame, wxMDIChildFrame
>
> # Used to say:
> # class BackgroundBase(Scriptable, wx.Frame, event.EventSource):
> class BackgroundBase(Scriptable, event.EventSource):
> """
> A window that contains Widgets.
> """
> def __init__(self, aParent, aBgRsrc, frameclass=wx.Frame):
> ...<original code>...
> #Changed original code from invoking wx.Frame here to a method passed down
> # First, call the base class' __init__ method to create the frame
> frameclass.__init__(self, aParent,
> self.id,
> #self.name,
> aBgRsrc.title,
> position,
> aBgRsrc.size,
> style | wx.NO_FULL_REPAINT_ON_RESIZE,
> aBgRsrc.name)
> ...<rest of original code>...
>
>
> class Background(BackgroundBase, wx.Frame):
> def __init__(self, aParent, aBgRsrc):
> return BackgroundBase.__init__(self, aParent, aBgRsrc,
> frameclass=wx.Frame)
>
> class MDIParentBackground(BackgroundBase, wxMDIParentFrame):
> def __init__(self, aParent, aBgRsrc):
> return BackgroundBase.__init__(self, aParent, aBgRsrc,
> frameclass=wxMDIParentFrame)
>
> class MDIChildBackground(BackgroundBase, wxMDIChildFrame):
> def __init__(self, aParent, aBgRsrc):
> return BackgroundBase.__init__(self, aParent, aBgRsrc,
> frameclass=wxMDIChildFrame)
>
> ############## end of mod to model.py #########################
>
> To use these two new classes, the code is remarkably unremarkable. The parent
>
> code:
>
> ############# Parent ######################
> #!/usr/bin/python
>
> """
> __version__ = "$Revision: 1.5 $"
> __date__ = "$Date: 2004/04/30 16:26:12 $"
> """
>
> from PythonCard import model
>
> MDI_rsrc=\
> {'application':{'type':'Application',
> 'name':'Template',
> 'backgrounds': [
> {'type':'Background',
> 'name':'bgTemplate',
> 'title':'Testing MDI Controls',
> 'size':(400, 300),
> 'style':['resizeable'],
>
> 'menubar': {'type':'MenuBar',
> 'menus': [
> {'type':'Menu',
> 'name':'menuFile',
> 'label':'&File',
> 'items': [
> {'type':'MenuItem',
> 'name':'menuFileExit',
> 'label':'E&xit',
> 'command':'exit',
> },
> ]
> },
> {'type':'Menu',
> 'name':'menuOptions',
> 'label':'Options',
> 'items': [
> {'type':'MenuItem',
> 'name':'menuOptionsOpenNew',
> 'label':'Open New\tAlt+N',
> 'command':'openNew',
> },
> ]
> },
> ]
> },
> 'components': [
>
> ] # end components
> } # end background
> ] # end backgrounds
> } }
>
> MyCW_rsrc=\
> {'application':{'type':'Application',
> 'name':'Template',
> 'backgrounds': [
> {'type':'Background',
> 'name':'bgTemplate',
> 'title':'Standard Template with File->Exit menu',
> 'size':(698, 517),
> 'style':['resizeable'],
>
> 'menubar': {'type':'MenuBar',
> 'menus': [
> {'type':'Menu',
> 'name':'menuFile',
> 'label':'&File',
> 'items': [
> {'type':'MenuItem',
> 'name':'menuFileExit',
> 'label':'E&xit',
> 'command':'exit',
> },
> ]
> },
> {'type':'Menu',
> 'name':'menuOptions',
> 'label':'Options',
> 'items': [
> {'type':'MenuItem',
> 'name':'menuOptionsOpenNew',
> 'label':'Open New\tAlt+N',
> 'command':'openNew',
> },
> ]
> },
> ]
> },
> 'components': [
>
> {'type':'TextArea',
> 'name':'TextArea1',
> 'position':(20, 20),
> 'size':(651, 333),
> },
>
> {'type':'Button',
> 'name':'Button1',
> 'position':(559, 376),
> 'label':'Button1',
> },
>
> ] # end components
> } # end background
> ] # end backgrounds
> } }
>
> class MyBackground(model.MDIParentBackground):
>
> def on_initialize(self, event):
> # if you have any initialization
> # including sizer setup, do it here
> #MDI.on_initialize(self, event)
> pass
> def on_openNew_command ( self, event ):
> # Create a child window
> child = model.childWindow(self, MyCW, rsrc=MyCW_rsrc)
>
> if __name__ == '__main__':
> app = model.Application(MyBackground, None, MDI_rsrc)
> app.MainLoop()
> ############# End of Parent ######################
>
> ############# Child ######################
> class MyCW(model.MDIChildBackground):
>
> def on_initialize(self, event):
> self.parent = self.getParent()
> self.components.TextArea1.text='I am only a child.'
> def on_openNew_command ( self, event ):
> return self.parent.on_openNew_command ( event )
> ############# End of Child ######################
>
> That's it!!!
>
> Now I have to play around with resizer to see how that would work here.
>
> --
> John Henry
> |