[wxPython-users] Re: Default Sizers,
First Draft (was Re: [wxPython-users]
Dj Gilcrease
digitalxero at gmail.com
Fri Jun 2 01:08:46 PDT 2006
Here is the basic idea I had for how to deal with tab order. This
works to tab though text controls across two frames, skiping the ones
I did not add to the order
[code block]
import wx
class TabGroup:
def __init__(self):
self.TabOrder = {}
self.LastItem = None
self.FirstItem = None
def AddItem(self, item):
self.TabOrder[item] = {}
self.TabOrder[item]['Next'] = self.FirstItem
self.TabOrder[item]['Prev'] = None
if self.LastItem != None:
self.TabOrder[item]['Prev'] = self.LastItem
self.TabOrder[self.LastItem]['Next'] = item
else:
self.FirstItem = item
self.LastItem = item
self.TabOrder[self.FirstItem]['Prev'] = self.LastItem
def AddItems(self, items):
for item in items:
self.AddItem(item)
def InsertItem(self, item, before):
for ctrl in self.TabOrder.keys():
if ctrl == before:
self.TabOrder[item] = {}
self.TabOrder[item]['Next'] = ctrl
self.TabOrder[item]['Prev'] = self.TabOrder[ctrl]['Prev']
self.TabOrder[self.TabOrder[ctrl]['Prev']]['Next'] = item
self.TabOrder[ctrl]['Prev'] = item
return True
return False
def SetNext(self, item, next):
self.TabOrder[item]['Next'] = next
def SetPrev(self, item, prev):
self.TabOrder[item]['Prev'] = prev
def GoNext(self, item):
self.TabOrder[item]['Next'].SetFocus()
def GoPrev(self, item):
self.TabOrder[item]['Prev'].SetFocus()
class BlankFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="Blank Window Isolation tester")
self.txt1 = wx.TextCtrl(self, -1, "Tab Stop 1")
self.txt2 = wx.TextCtrl(self, -1, "Tab Stop 3")
self.txt3 = wx.TextCtrl(self, -1, "Tab Stop 5")
self.txt4 = wx.TextCtrl(self, -1, "No Tab Stop 1", style=wx.TE_READONLY)
self.txt5 = wx.TextCtrl(self, -1, "Tab Stop 7")
self.txt6 = wx.TextCtrl(self, -1, "Tab Stop 9")
self.txt7 = wx.TextCtrl(self, -1, "Tab Stop 10")
self.txt8 = wx.TextCtrl(self, -1, "Tab Stop 12")
self.txt9 = wx.TextCtrl(self, -1, "No Tab Stop 2", style=wx.TE_READONLY)
#Do Sizer Stuff
self.basesizer = wx.BoxSizer(wx.VERTICAL)
self.basesizer.Add( self.txt1,0,wx.EXPAND )
self.basesizer.Add( self.txt2,0,wx.EXPAND )
self.basesizer.Add( self.txt3,0,wx.EXPAND )
self.basesizer.Add( self.txt4,0,wx.EXPAND )
self.basesizer.Add( self.txt5,0,wx.EXPAND )
self.basesizer.Add( self.txt6,0,wx.EXPAND )
self.basesizer.Add( self.txt7,0,wx.EXPAND )
self.basesizer.Add( self.txt8,0,wx.EXPAND )
self.basesizer.Add( self.txt9,0,wx.EXPAND )
self.SetSizer(self.basesizer)
self.SetAutoLayout(True)
self.Fit()
class BlankFrame2(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="Blank Window Isolation tester")
self.txt1 = wx.TextCtrl(self, -1, "Tab Stop 2")
self.txt2 = wx.TextCtrl(self, -1, "Tab Stop 4")
self.txt3 = wx.TextCtrl(self, -1, "Tab Stop 6")
self.txt4 = wx.TextCtrl(self, -1, "No Tab Stop 1", style=wx.TE_READONLY)
self.txt5 = wx.TextCtrl(self, -1, "Tab Stop 8")
self.txt6 = wx.TextCtrl(self, -1, "Tab Stop 11")
self.txt7 = wx.TextCtrl(self, -1, "Tab Stop 13")
self.txt8 = wx.TextCtrl(self, -1, "Tab Stop 14")
self.txt9 = wx.TextCtrl(self, -1, "No Tab Stop 2", style=wx.TE_READONLY)
#Do Sizer Stuff
self.basesizer = wx.BoxSizer(wx.VERTICAL)
self.basesizer.Add( self.txt1,0,wx.EXPAND )
self.basesizer.Add( self.txt2,0,wx.EXPAND )
self.basesizer.Add( self.txt3,0,wx.EXPAND )
self.basesizer.Add( self.txt4,0,wx.EXPAND )
self.basesizer.Add( self.txt5,0,wx.EXPAND )
self.basesizer.Add( self.txt6,0,wx.EXPAND )
self.basesizer.Add( self.txt7,0,wx.EXPAND )
self.basesizer.Add( self.txt8,0,wx.EXPAND )
self.basesizer.Add( self.txt9,0,wx.EXPAND )
self.SetSizer(self.basesizer)
self.SetAutoLayout(True)
self.Fit()
class BlankApp(wx.App):
def OnInit(self):
self.frame1 = BlankFrame()
self.frame1.Show()
self.SetTopWindow(self.frame1)
self.frame2 = BlankFrame2()
self.frame2.Show()
#Do Tab Order Stuff
tablist = [self.frame1.txt1, self.frame2.txt1,
self.frame1.txt2, self.frame2.txt2,
self.frame1.txt3, self.frame2.txt3,
self.frame1.txt5, self.frame2.txt5,
self.frame1.txt6, self.frame1.txt7,
self.frame2.txt6, self.frame1.txt8,
self.frame2.txt7, self.frame2.txt8]
self.tabgroup = TabGroup()
self.tabgroup.AddItems(tablist)
self.Bind(wx.EVT_NAVIGATION_KEY, self.OnChar)
return True
def OnChar(self, event):
#Not sure how to determin if only Tab or Shift Tab was used to initiate
self.tabgroup.GoNext( self.frame1.FindFocus() )
if __name__ == "__main__":
app = BlankApp(0)
app.MainLoop()
[/codeblock]
Of Course it would be better to have TabGroup as wx.TabGroup and add
SetTabGroup to wx.Window. Doing that would let us set a tab group for
each container widget and insted of having it a totaly cyclical list
the Next component of the last item in a group would be left blank and
wx would move to the next container widget (Frame, panel, etc) that
contained a tabgroup and start navigating there. wx determination
would be based on order of creation
If you did not want wx to determin what the next container widget
should be you could call the SetNextGroup() method so wx know which
group you want to navigate to next, SetPrevGroup() would automaticly
be called for the tabgroup that got switched to so it knows its
backwards order is set and not to be determined by wx.
Think thats sould cover everything, So toss you ideas coments etc
about this around :)
--
Dj Gilcrease
OpenRPG Developer
~~http://www.openrpg.com
OpenRPG++ Lead Developer
~~http://www.digitalxero.net
XeroWiki Creator
~~http://www.digitalxero.net
Web Admin for Thewarcouncil.us
~~http://www.thewarcouncil.us
More information about the wxpython-users
mailing list