467,228 Members | 1,377 Online
Bytes | Developer Community
Ask Question

Home New Posts Topics Members FAQ

Post your question to a community of 467,228 developers. It's quick & easy.

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.SetDefaultItem(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.TextCtrl(self, -1, size=(250, -1), value="XXX"))

self.SetAutoLayout(True)
self.SetSizer(sizer)
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(self), 0, wx.EXPAND)
b = wx.Button(self, wx.NewId(), "Quit")
wx.EVT_BUTTON(self, b.GetId(), self.on_quit)
sizer.Add(b, 0, wx.EXPAND)

self.SetDefaultItem(b)
b.SetFocus()

self.SetAutoLayout(True)
self.SetSizer(sizer)
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 ---
Jul 18 '05 #1
  • viewed: 5021
Share:
1 Reply
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
Jul 18 '05 #2

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

19 posts views Thread by Grant Edwards | last post: by
1 post views Thread by mdk.R | last post: by
3 posts views Thread by John Salerno | last post: by
2 posts views Thread by crystalattice | last post: by
3 posts views Thread by citronelu@yahoo.com | last post: by
16 posts views Thread by Andrea Gavana | last post: by
reply views Thread by Adict | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.