【问题标题】:wxpython: Multiple panels with wx.SashLayoutWindowwxpython:带有 wx.SashLayoutWindow 的多个面板
【发布时间】:2012-01-09 16:05:03
【问题描述】:

我正在尝试创建这个:

|---------------------------------------------|
| 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()

【问题讨论】:

    标签: python wxpython


    【解决方案1】:

    布局管理的一般概念是容器和小部件。在容器中,您可以放置​​其他容器和小部件。要完成给定的布局,您必须以一种巧妙的方式在层次结构中组织容器和小部件。由于您提供的代码仍然不完整,我不会为您提供完整的解决方案,而是回答您如何拆分两个面板的问题。

    1. 创建两个面板,分别是panel1panel2panel3。看来你已经做到了。
    2. 在两者上设置 sizers(例如 BoxSizer
    3. 创建两个面板,panel1apanel1bpanel1 作为父面板。根据需要将小部件放置在这两个面板中。
    4. 创建两个面板,panel2apanel2bpanel2 作为父面板。根据需要将小部件放置在这两个面板中。
    5. 完成!对于所需的布局,您不一定需要Splitter(仅当您希望使它们可调整大小时。在这种情况下,panel1panel2 将被拆分器替换。阅读this example 了解详细信息)李>

    可视化:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      相关资源
      最近更新 更多