wxPython: Default Frame button?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Miki Tebeka

    wxPython: Default Frame button?

    Hello All,

    I have a frame that contains a panel and several buttons.
    I'd like to make one of the button the default button but
    self.SetDefault Item(btn) or btn.SetFocus() don't work. The item in
    focus is a text control inside the panel.

    Any Ideas? (see short example below)

    Thanks.
    Miki

    --- btn.py ---
    import wx

    class P(wx.Panel):
    def __init__(self, parent, id=-1):
    wx.Panel.__init __(self, parent, id)
    sizer = wx.BoxSizer(wx. VERTICAL)
    sizer.Add(wx.Te xtCtrl(self, -1, size=(250, -1), value="XXX"))

    self.SetAutoLay out(True)
    self.SetSizer(s izer)
    sizer.Fit(self)

    class F(wx.Frame):
    def __init__(self):
    wx.Frame.__init __(self, None, -1, "Test Frame")
    sizer = wx.BoxSizer(wx. VERTICAL)
    sizer.Add(P(sel f), 0, wx.EXPAND)
    b = wx.Button(self, wx.NewId(), "Quit")
    wx.EVT_BUTTON(s elf, b.GetId(), self.on_quit)
    sizer.Add(b, 0, wx.EXPAND)

    self.SetDefault Item(b)
    b.SetFocus()

    self.SetAutoLay out(True)
    self.SetSizer(s izer)
    sizer.Fit(self)


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


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

    if __name__ == "__main__":
    main()

    --- btn.py ---
  • Cliff Wells

    #2
    Re: wxPython: Default Frame button?

    On Mon, 2003-08-04 at 06:22, Miki Tebeka wrote:[color=blue]
    > Hello Cliff,
    >[color=green]
    > > 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.[/color]
    > 10x. Works like a charm.
    >[color=green]
    > >class F(wx.Frame):
    > > def __init__(self):
    > > wx.Frame.__init __(self, None, -1, "Test Frame")
    > > panel = P(self)
    > > self.Fit()[/color]
    >
    > Is there a default frame that does the above?[/color]

    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(p anel, b.GetId(), self.on_quit)

    sizer.AddMany([
    (wx.TextCtrl(pa nel, -1, size = (250, -1), value = "XXX")),
    (b, 0, wx.EXPAND),
    ])

    panel.SetDefaul tItem(b)
    b.SetFocus()

    panel.SetAutoLa yout(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(s elf, b.GetId(), lambda evt: parent.Close(Tr ue))

    sizer.AddMany([
    (wx.TextCtrl(se lf, -1, size = (250, -1), value = "XXX")),
    (b, 0, wx.EXPAND),
    ])

    self.SetDefault Item(b)
    b.SetFocus()

    self.SetAutoLay out(True)
    self.SetSizer(s izer)
    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


    Comment

    Working...