User interface wxpython boxsizer:动态添加项目时出现问题

User interface wxpython boxsizer:动态添加项目时出现问题,user-interface,wxpython,boxsizer,User Interface,Wxpython,Boxsizer,这让我快发疯了。我通常用Tkinter来做gui的东西,但我只是觉得实际上我想学习wxpython 当我使用boxsizer向面板添加按钮或静态文本等项目时,我一辈子都不明白为什么。它似乎把所有的东西都塞进了面板“side”的位置(0,0),这是我的代码 import wx def AddUser(): ex = wx.App() Stylex = wx.SYSTEM_MENU|wx.CAPTION|wx.CLOSE_BOX wi

这让我快发疯了。我通常用Tkinter来做gui的东西,但我只是觉得实际上我想学习wxpython

当我使用boxsizer向面板添加按钮或静态文本等项目时,我一辈子都不明白为什么。它似乎把所有的东西都塞进了面板“side”的位置(0,0),这是我的代码

    import wx

    def AddUser():
        ex = wx.App()
        Stylex = wx.SYSTEM_MENU|wx.CAPTION|wx.CLOSE_BOX
        window = wx.Frame(None, style=Stylex)

        splitter = wx.SplitterWindow(window, -1)
        vbox = wx.BoxSizer(wx.VERTICAL)
        """
        LEFT PANEL... Contains Navigation Tree
        """
        fgs = wx.FlexGridSizer(2,1,5,10) # fgs(int rows, int cols, int vgap, int hgap

        panel = wx.Panel(splitter, -1)
        panel.SetBackgroundColour('#ededed')

        side = wx.Panel(splitter, -1)
        side.SetBackgroundColour('#4f5049')

        multi_btn = wx.Button(panel, label="Batch User Mode")
        multi_btn.SetId(50)

        single_btn = wx.Button(panel, label="Single User Mode")
        single_btn.SetId(25)

        items = [multi_btn,single_btn]

        fgs.AddMany(items)
        vbox.Add(fgs)

        panel.SetSizer(vbox)
        splitter.SplitVertically(panel, side,100)

        """
        SIDE panel...  Contains all widgets
        """
        st = wx.StaticText(side, label="Select a Mode", pos=wx.Point(20,100))
        st.SetForegroundColour(wx.WHITE)

        def SetMode(event):
            """
            25 returned if Single user mode
            50 returned if Batch user mode
            """
            MODE = event.GetId()

            if MODE == 25:
                try:
                    side.DestroyChildren()
                except: pass

                """
                Problem adding items to the dynamnic changing 'SIDE' panel
                """
                vb = wx.BoxSizer(wx.VERTICAL)

                stFName = wx.StaticText(side, id=2,label="First Name:")
                stFName.SetForegroundColour(wx.WHITE)
                vb.Add(stFName)
                tcFName = wx.TextCtrl(side, id=4)
                vb.Add(tcFName)

                stLName = wx.StaticText(side,id=6, label="Last Name:")
                vb.Add(stLName)
                tcLName = wx.TextCtrl(side, id=8)
                vb.Add(tcLName)

                vb.Add(side, 1, flag=wx.EXPAND|wx.ALL, border=5)

                side.SetSizer(vb)

                """
                END Problem
                """
            if MODE == 50:
                try:
                    side.DestroyChildren()
                except: pass
                """
                do the same thing as single user creation, except adding listboxes instead of textctrl's
                """
            return

        multi_btn.Bind(wx.EVT_BUTTON, SetMode)
        single_btn.Bind(wx.EVT_BUTTON, SetMode)

        window.SetTitle('User Creation Process')
        window.Centre()
        window.Show(True)

        ex.MainLoop()

    if __name__=='__main__':
        AddUser()
非常感谢你的帮助。。。我肯定我忽略了一些小问题,但我想知道这是否是一个根本性的问题


兰迪

这是默认位置。尺寸测量仪不适用于绝对定位。如果愿意,可以通过在每个小部件中传递一个位置来实现。如果你想让你的小部件在左边居中,那么你需要把垂直的BoxSizer放在一个水平的BoxSizer里面,然后把它居中。或者,您可以通过使用AddSpacer或只添加一个尺寸来使用两个垫片:

mySizer.Add((10, 20), 0, wx.ALL, 5)
您还可以使用Sizer的Add方法的“border”参数,在一定程度上使用wx.TOP、wx.BOTTOM、wx.RIGHT或wx.LEFT控制放置,并为其提供适当的空间量。如果您看到小部件堆叠起来,那么您需要在末尾添加布局调用(可能来自面板或框架)


更新:如果您想交换面板,我建议您只隐藏并显示它们,或者销毁并创建面板。我写了一篇关于切换面板的教程,可能会有所帮助:

这是默认的位置。尺寸测量仪不适用于绝对定位。如果愿意,可以通过在每个小部件中传递一个位置来实现。如果你想让你的小部件在左边居中,那么你需要把垂直的BoxSizer放在一个水平的BoxSizer里面,然后把它居中。或者,您可以通过使用AddSpacer或只添加一个尺寸来使用两个垫片:

mySizer.Add((10, 20), 0, wx.ALL, 5)
您还可以使用Sizer的Add方法的“border”参数,在一定程度上使用wx.TOP、wx.BOTTOM、wx.RIGHT或wx.LEFT控制放置,并为其提供适当的空间量。如果您看到小部件堆叠起来,那么您需要在末尾添加布局调用(可能来自面板或框架)


更新:如果您想交换面板,我建议您只隐藏并显示它们,或者销毁并创建面板。我写了一篇关于开关面板的教程,这可能会有所帮助:

OP不使用sizer来设置绝对位置。他们在初始化过程中设置了一个绝对位置,但在将东西添加到sizer之前,他们破坏了面板的所有子级。我没有看到任何位置,但我一定错过了它。谢谢@MikeDriscoll,我还没有让它工作,但我一定会看那个教程。理想情况下,我不想使用绝对定位,但我试着让StaticText(“st”)浮动到一个新的位置。。。我想我的下一步是做更多的教程,我只是觉得它应该像<代码>侧面。。。它已经存在了然后你设置你的
boxsizer
然后你将你的
wx.button和wx.staticText添加到你的boxsizer
然后你的
面板设置boxsizer
你知道。。。这不是世界末日做一个绝对的位置。。。我可以让它工作的方式,我包括mySizers后,每个。。。我想你可以称之为网格。我想我的问题的一部分是我在想,我可以把我创建的所有项目添加到一个垂直的boxsizer中,而不使用任何水平的Sizer。。。相反,我认为我应该把重点放在将项目放入网格中。是的,当你限制用户调整框架大小的能力时,绝对定位没有任何错误。否则,布局可能看起来有点奇怪。我仍然认为你可以用一些间隔器和一些尺寸器嵌套来做你想做的,但是有时候当你刚刚学习wxPython时,这可能是一件痛苦的事情。OP不使用尺寸器来设置绝对位置。他们在初始化过程中设置了一个绝对位置,但在将东西添加到sizer之前,他们破坏了面板的所有子级。我没有看到任何位置,但我一定错过了它。谢谢@MikeDriscoll,我还没有让它工作,但我一定会看那个教程。理想情况下,我不想使用绝对定位,但我试着让StaticText(“st”)浮动到一个新的位置。。。我想我的下一步是做更多的教程,我只是觉得它应该像<代码>侧面。。。它已经存在了然后你设置你的
boxsizer
然后你将你的
wx.button和wx.staticText添加到你的boxsizer
然后你的
面板设置boxsizer
你知道。。。这不是世界末日做一个绝对的位置。。。我可以让它工作的方式,我包括mySizers后,每个。。。我想你可以称之为网格。我想我的问题的一部分是我在想,我可以把我创建的所有项目添加到一个垂直的boxsizer中,而不使用任何水平的Sizer。。。相反,我认为我应该把重点放在将项目放入网格中。是的,当你限制用户调整框架大小的能力时,绝对定位没有任何错误。否则,布局可能看起来有点奇怪。我仍然认为你可以用一些垫片和一些尺寸标注嵌套来做你想做的事情,但有时这在你刚刚学习wxPython时会是一件痛苦的事情。我只是注意到你在
vb
中添加了
side
,但随后将
vb
设置为
side
的尺寸标注。所以
vb
包含
side
其中包含
vb
其中包含
side
其中包含。。。我头痛。如果不将
side
添加到
vb
,会发生什么?嘿,谢谢@acattle我删除了
vb的部分。添加(side,1,flag=wx.EXPAND | wx.ALL,border=5)
,但它似乎没有帮助。。。这告诉我我可以把它排除在代码之外?整件事让我头疼。hahaI刚刚注意到您添加了
sid