[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