wxPython: Default Frame button?

Cliff Wells logiplex at qwest.net
Mon Aug 4 20:24:53 CEST 2003


On Mon, 2003-08-04 at 06:22, Miki Tebeka wrote:
> Hello Cliff,
> 
> > In general, the only child of a frame should be a panel or some other
> > container (like a splitter).  Frames should generally only have one
> > child.  Make the button a child of the panel rather than a sibling.
> 10x. Works like a charm.
> 
> >class F(wx.Frame):
> >    def __init__(self):
> >        wx.Frame.__init__(self, None, -1, "Test Frame")
> >        panel = P(self)
> >        self.Fit()
> 
> Is there  a default frame that does the above?

No.  However, you can combine the frame and panel code into a single
class if you like:

import wx

class F(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "Test Frame")
        panel = wx.Panel(self, -1)
        sizer = wx.BoxSizer(wx.VERTICAL)

        b = wx.Button(panel, -1, "Quit")
        wx.EVT_BUTTON(panel, b.GetId(), self.on_quit)
        
        sizer.AddMany([
            (wx.TextCtrl(panel, -1, size = (250, -1), value = "XXX")),
            (b, 0, wx.EXPAND),
            ])
        
        panel.SetDefaultItem(b)
        b.SetFocus()

        panel.SetAutoLayout(True)
        panel.SetSizer(sizer)
        sizer.Fit(panel)
        
        self.Fit()

    def on_quit(self, e):
        self.Close(True)


def main():
    app = wx.PySimpleApp()
    f = F()
    f.Show(True)
    app.MainLoop()


if __name__ == "__main__":
    main()
    


Alternatively, you can dispense with creating a custom class for the
frame (which is perhaps a bit closer to what you are asking):


import wx

class P(wx.Panel):
    def __init__(self, parent, id = -1):
        wx.Panel.__init__(self, parent, id)
        sizer = wx.BoxSizer(wx.VERTICAL)

        b = wx.Button(self, -1, "Quit")
        wx.EVT_BUTTON(self, b.GetId(), lambda evt: parent.Close(True))
        
        sizer.AddMany([
            (wx.TextCtrl(self, -1, size = (250, -1), value = "XXX")),
            (b, 0, wx.EXPAND),
            ])
        
        self.SetDefaultItem(b)
        b.SetFocus()

        self.SetAutoLayout(True)
        self.SetSizer(sizer)
        sizer.Fit(self)


def main():
    app = wx.PySimpleApp()
    f = wx.Frame(None, -1, "Test Frame")
    P(f)
    f.Fit()
    f.Show(True)
    app.MainLoop()


if __name__ == "__main__":
    main()

    

Personally, I prefer to keep objects discrete, especially for panels
which might at some point get moved to some other container (say you
decide to put a notebook or splitter in the frame), but if you're not
concerned about that then these are both valid approaches.

Regards,

-- 
Cliff Wells, Software Engineer
Logiplex Corporation (www.logiplex.net)
(503) 978-6726  (800) 735-0555






More information about the Python-list mailing list