多个面板

时间:2012-01-07 16:27:14

标签: python wxpython

我的程序遇到两个问题。下面的代码会在生成3时生成两个面板。它会生成panel1panel2没有问题,panel3应该在panel2的右边,无处可见。 Panel1panel2垂直拆分我正在尝试对panel2panel3进行同样的操作

我的第二个问题是如何在panel1下生成另一个面板而不会中断panel1panel2之间的拆分器,然后在panel1和新创建的面板之间创建一个拆分器在它下面?

import wx


class Panels(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title)

        hbox = wx.BoxSizer(wx.HORIZONTAL)
        splitter = wx.SplitterWindow(self, -1)

        vbox1 = wx.BoxSizer(wx.VERTICAL)
        panel1 = wx.Panel(splitter, -1)
        panel12 = wx.Panel(panel1, -1, style=wx.BORDER_SUNKEN)
        st1 = wx.StaticText(panel12, -1, 'Panel 1', (5, 5))
        vbox1.Add(panel12, 1, wx.EXPAND)
        panel1.SetSizer(vbox1)

        vbox2 = wx.BoxSizer(wx.VERTICAL)
        panel2 = wx.Panel(splitter, -1)
        panel22 = wx.Panel(panel2, -1, style=wx.BORDER_RAISED)
        st2 = wx.StaticText(panel22, -1, 'Panel 2', (5, 5))
        vbox2.Add(panel22, 1, wx.EXPAND)
        panel2.SetSizer(vbox2)

        vbox3 = wx.BoxSizer(wx.VERTICAL)
        panel3 = wx.Panel(splitter, -1)
        panel32 = wx.Panel(panel3, -1, style=wx.BORDER_RAISED)
        st3 = wx.StaticText(panel32, -1, 'Panel 3', (5, 5))
        vbox3.Add(panel32, 1, wx.EXPAND)
        panel3.SetSizer(vbox3)

        hbox.Add(splitter, 1, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
        self.SetSizer(hbox)
        self.CreateStatusBar()
        splitter.SplitVertically(panel1, panel3)
        splitter.SplitVertically(panel2, panel3)
        self.Centre()
        self.Show(True)


    def ExitApp(self, event):
        self.Close()


app = wx.App()
Panels(None, -1, 'Panels')
app.MainLoop()

2 个答案:

答案 0 :(得分:5)

你有几个选择。你可以嵌套你的SplitterWindows,这有点令人困惑但有效。或者您可以使用MultiSplitterWindow小部件。

对于第一个,我会做这样的事情:

  1. 创建主分割器和子分割器
  2. 在子拆分器中,但前两个面板
  3. 将子拆分器和第3个面板放在主拆分器
  4. 或其中的一些变化。

    编辑:这是一个例子:

    import wx
    
    ########################################################################
    class RandomPanel(wx.Panel):
        """"""
    
        #----------------------------------------------------------------------
        def __init__(self, parent, color):
            """Constructor"""
            wx.Panel.__init__(self, parent)
            self.SetBackgroundColour(color)
    
    
    
    ########################################################################
    class MainPanel(wx.Panel):
        """"""
    
        #----------------------------------------------------------------------
        def __init__(self, parent):
            """Constructor"""
            wx.Panel.__init__(self, parent)
    
            topSplitter = wx.SplitterWindow(self)
            hSplitter = wx.SplitterWindow(topSplitter)
    
            panelOne = RandomPanel(hSplitter, "blue")
            panelTwo = RandomPanel(hSplitter, "red")
            hSplitter.SplitVertically(panelOne, panelTwo)
            hSplitter.SetSashGravity(0.5)
    
            panelThree = RandomPanel(topSplitter, "green")
            topSplitter.SplitHorizontally(hSplitter, panelThree)
            topSplitter.SetSashGravity(0.5)
    
            sizer = wx.BoxSizer(wx.VERTICAL)
            sizer.Add(topSplitter, 1, wx.EXPAND)
            self.SetSizer(sizer)
    
    ########################################################################
    class MainFrame(wx.Frame):
        """"""
    
        #----------------------------------------------------------------------
        def __init__(self):
            """Constructor"""
            wx.Frame.__init__(self, None, title="Nested Splitters",
                              size=(800,600))
            panel = MainPanel(self)
            self.Show()
    
    #----------------------------------------------------------------------
    if __name__ == "__main__":
        app = wx.App(False)
        frame = MainFrame()
        app.MainLoop()
    

    另请参阅wx.SashLayoutWindow:http://www.wxpython.org/docs/api/wx.SashLayoutWindow-class.html

答案 1 :(得分:0)

问题1: 创建一个horzontal vbox sizer。添加panel2和panel3的sizer。这将使panel2和panel3彼此相邻。然后将水平sizer作为第二项添加到拆分器中。

问题2: 创建另一个拆分器并添加到sizer(我假设拆分器是一个类似于面板的小部件)。然后创建另一个面板并将其添加到该拆分器。因此,您最终将分离器嵌套在sizer中。 (虽然可能不需要sizer。)然后sizer在主分割器内。您可以在第一个中添加第二个拆分器。