首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wxpython boxsizer:动态添加项目的问题

wxpython boxsizer:动态添加项目的问题
EN

Stack Overflow用户
提问于 2012-08-22 20:42:48
回答 1查看 1.5K关注 0票数 1

这快把我逼疯了。我通常使用Tkinter来做gui方面的工作,但我只是想真正尝试学习wxpython。

当我使用boxsizer将按钮或静态文本等项添加到面板时,我无法弄清楚为什么要这样做。它似乎把所有东西都塞进了面板"side“上的位置(0,0)。这是我的代码。

代码语言:javascript
复制
    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()

非常感谢你的帮助...我确定这是我忽略的一些小问题,但我想知道这是否是一个根本问题。

兰迪

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-22 22:26:43

这是默认的位置。Sizers不是用于绝对定位的。如果您愿意,可以通过在每个小部件中传递一个位置来完成此操作。如果你想让你的BoxSizer在左边居中,那么你需要把垂直的widgets放在一个水平的widgets里面并居中。或者,您可以通过使用AddSpacer或仅添加大小来使用几个间隔符:

代码语言:javascript
复制
mySizer.Add((10, 20), 0, wx.ALL, 5)

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

更新:如果你想换掉面板,我建议你只需要隐藏和显示它们,或者销毁和创建面板。我写了一个关于切换面板的教程,可能会有所帮助:http://www.blog.pythonlibrary.org/2010/06/16/wxpython-how-to-switch-between-panels/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12073415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档