1

これは私を夢中にさせています。普段は GUI で Tkinter を使っていますが、実際に wxpython を学ぼうとしているような気がしました。

ボックスサイザーを使用して、ボタンや静的テキストなどのアイテムをパネルに追加するとき、その理由を一生理解できません。「サイド」と呼ばれるパネルの位置 (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()

助けてくれてありがとう...私が見落とした小さなものだと確信していますが、それが根本的な問題であるかどうかを理解したいと思います。

ランディ

4

1 に答える 1

1

それがデフォルトの配置です。サイザーは絶対位置決め用ではありません。必要に応じて、各ウィジェットに位置を渡すことでそれを行うことができます。ウィジェットを左側の中央に配置したい場合は、垂直の BoxSizer を水平の BoxSizer の内側に配置して中央に配置する必要があります。または、 AddSpacer を使用するか、サイズを追加するだけで、いくつかのスペーサーを使用できます。

mySizer.Add((10, 20), 0, wx.ALL, 5)

Sizer の Add メソッドの「border」パラメーターを使用して、wx.TOP、wx.BOTTOM、wx.RIGHT、または wx.LEFT を使用して配置をある程度制御し、適切な量のスペースを与えることもできます。ウィジェットが積み重なっている場合は、最後に (おそらくパネルまたはフレームから) Layout 呼び出しを追加する必要があります。

更新:パネルを交換したい場合は、パネルを非表示にして表示するか、パネルを破棄して作成することをお勧めします。役立つパネルの切り替えに関するチュートリアルを作成しました: http://www.blog.pythonlibrary.org/2010/06/16/wxpython-how-to-switch-between-panels/

于 2012-08-22T14:26:43.110 に答える