By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
440,130 Members | 2,100 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 440,130 IT Pros & Developers. It's quick & easy.

wxPython: Default Frame button?

P: n/a
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
Share this Question
Share on Google+
1 Reply


P: n/a
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.