【问题标题】:Multiple panels多个面板
【发布时间】:2018-07-07 18:04:14
【问题描述】:

我的程序有两个问题。下面的代码在应该生成 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()

【问题讨论】:

    标签: python wxpython


    【解决方案1】:

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

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

    1. 创建一个主拆分器和一个子拆分器
    2. 在子拆分器中,但在前两个面板中
    3. 将副分线器和第三个面板放在主分线器中

    或其中的一些变体。

    编辑:这是一个例子:

    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

    【讨论】:

    • 你能给我一个嵌套拆分器的例子吗?
    • 我添加了一个示例,尽管我认为您应该尝试一下。
    • @MikeDriscoll,我删除了我的答案,因为你的答案要好得多。但是,我到 wx.SashLayoutWindow 的链接消失了。也许您想包含这种可能性以获得更完整的答案。
    • MultiSplitterWindow!这挽救了我的理智。
    • 是的,很方便!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多