wxpython: 使用wx.SashLayoutWindow实现多个面板
我正在尝试创建这个:
|---------------------------------------------|
| 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
布局管理的基本概念是容器和小部件。容器里可以放其他的容器和小部件。为了实现你想要的布局,你需要聪明地组织这些容器和小部件,形成一个层级结构。由于你提供的代码还不完整,我不会给你一个完整的解决方案,而是告诉你如何把两个面板分开。
- 创建三个面板,分别叫做
panel1
、panel2
和panel3
。看起来你已经做到这一点了。 - 给这两个面板设置布局管理器(比如说
BoxSizer
)。 - 在
panel1
下面再创建两个面板,叫panel1a
和panel1b
。然后在这两个面板里放入你想要的小部件。 - 在
panel2
下面也创建两个面板,叫panel2a
和panel2b
。同样地,在这两个面板里放入你想要的小部件。 - 完成了!为了达到你想要的布局,其实不一定需要一个
Splitter
(只有当你希望它们可以调整大小时才需要。在这种情况下,panel1
和panel2
会被分隔器替代。想了解更多细节,可以查看 这个例子)。
可视化效果:
+ mainframe (horizontal layout)
|
+-panel1 (vertical layout)
| +-panel1a
| +-panel1b
|
+-panel2 (vertical layout)
| +panel2a
| +panel2b
|
+-panel3