wxpython: 使用wx.SashLayoutWindow实现多个面板

2 投票
1 回答
808 浏览
提问于 2025-04-17 09:52

我正在尝试创建这个:

|---------------------------------------------|
| Panel 1a |        Panel 2a        | Panel 3 |
|          |                        |         |
|          |                        |         |
|-----------------------------------|         |
| Panel 1b |        Panel 2b        |         |
|          |                        |         |
|---------------------------------------------|

到目前为止,我只能创建这个:

|---------------------------------------------|
| Panel 1a |        Panel 2a        | Panel 3 |
|          |                        |         |
|          |                        |         |
|---------------------------------------------|

我该如何用一个分隔条把面板1a和面板2a分成两半呢?

我的代码如下:

import wx


class TestSashWindow(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1)

        winids = []


        leftwin1 =  wx.SashLayoutWindow(self, -1, wx.DefaultPosition, (200, 30), wx.NO_BORDER|wx.SW_3D)
        leftwin1.SetDefaultSize((120, 1000))
        leftwin1.SetOrientation(wx.LAYOUT_VERTICAL)
        leftwin1.SetAlignment(wx.LAYOUT_RIGHT)
        leftwin1.SetSashVisible(wx.SASH_LEFT, True)



        self.leftWindow1 = leftwin1
        winids.append(leftwin1.GetId())
        self.remainingSpace = wx.Panel(self, -1, style=wx.SUNKEN_BORDER)


        leftwin2 = wx.SashLayoutWindow(self, -1, wx.DefaultPosition, (200, 30), wx.NO_BORDER|wx.SW_3D)
        leftwin2.SetDefaultSize((120, 1000))
        leftwin2.SetOrientation(wx.LAYOUT_VERTICAL)
        leftwin2.SetAlignment(wx.LAYOUT_LEFT)
        leftwin2.SetSashVisible(wx.SASH_RIGHT, True)

        self.leftWindow2 = leftwin2
        winids.append(leftwin2.GetId())
        self.remainingSpace = wx.Panel(self, -1, style=wx.SUNKEN_BORDER)

        self.Bind(wx.EVT_SASH_DRAGGED_RANGE, self.OnSashDrag,id=min(winids), id2=max(winids))
        self.Bind(wx.EVT_SIZE, self.OnSize)
        slw = leftwin1

        x = wx.Notebook(slw, -1)
        for i in xrange(2):
            x.AddPage(wx.Panel(x, -1), str(i))

class mainframe(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, size=(400,300), title="sash test")

        self.a = TestSashWindow(self)


if __name__ == '__main__':
    a = wx.App(0)
    b = mainframe()
    b.Show(1)
    a.MainLoop()

1 个回答

0

布局管理的基本概念是容器和小部件。容器里可以放其他的容器和小部件。为了实现你想要的布局,你需要聪明地组织这些容器和小部件,形成一个层级结构。由于你提供的代码还不完整,我不会给你一个完整的解决方案,而是告诉你如何把两个面板分开。

  1. 创建三个面板,分别叫做 panel1panel2panel3。看起来你已经做到这一点了。
  2. 给这两个面板设置布局管理器(比如说 BoxSizer)。
  3. panel1 下面再创建两个面板,叫 panel1apanel1b。然后在这两个面板里放入你想要的小部件。
  4. panel2 下面也创建两个面板,叫 panel2apanel2b。同样地,在这两个面板里放入你想要的小部件。
  5. 完成了!为了达到你想要的布局,其实不一定需要一个 Splitter(只有当你希望它们可以调整大小时才需要。在这种情况下,panel1panel2 会被分隔器替代。想了解更多细节,可以查看 这个例子)。

可视化效果:

+ mainframe (horizontal layout)
|
+-panel1 (vertical layout)
| +-panel1a
| +-panel1b
|
+-panel2 (vertical layout)
| +panel2a
| +panel2b
|
+-panel3

撰写回答