wx.SplitterWindow的Sizer不能正常运行wxPython

时间:2015-08-03 01:38:31

标签: wxpython sizer

所以我有三个分割窗口,我试图使用sizer,以便在调整大小等时它们正常。这是我现在的代码。它不起作用。

class SplitterFrame (wx.Frame):

def __init__(self):
 #Create a master window
    self.mainframe = wx.Frame.__init__(self,None,title = 'some frame')
    self.splitter = wx.SplitterWindow(self,-1, style = wx.SP_LIVE_UPDATE)
    self.splitter2 = wx.SplitterWindow(self.splitter,-1, style = wx.SP_LIVE_UPDATE)
    self.splitter.SetMinimumPaneSize(330)
    self.splitter2.SetMinimumPaneSize(160)


    self.panel1 = wx.Panel(self.splitter,-1)
    self.panel1.SetBackgroundColour(wx.WHITE)

    self.panel2 = wx.Panel(self.splitter2,-1)
    self.panel2.SetBackgroundColour(wx.WHITE)

    self.panel3 = wx.Panel(self.splitter2, -1)
    self.panel3.SetBackgroundColour(wx.WHITE)

    #Splitter window attributes
    self.splitter2.SplitVertically(self.panel2,self.panel3, 100)
    self.splitter.SplitVertically(self.panel1,self.splitter2, 200)
    self.splitter.SetSashGravity(0)
    self.splitter2.SetSashGravity(1)
    self.splitter.SetSashPosition(1,redraw = True)
    self.splitter2.SetSashPosition(10000,redraw = True)
    self.Centre()
    self.Layout()
    self.Maximize(True)
    self.Bind(wx.EVT_CLOSE,self.OnClose)

                                   #Set Sizers
    sizer = wx.BoxSizer(wx.VERTICAL)
    sizer.Add(self.splitter,1,wx.ALL|wx.EXPAND)
    sizer.Add(self.splitter2,1,wx.ALL|wx.EXPAND)
    self.SetSizer(sizer)

有人可以告诉我如何将正确的sizer应用于此吗?我对sizer一点都不擅长,所以我只是使用了上面的那些[wxPython Splitter windows and Panels

1 个答案:

答案 0 :(得分:3)

您无法将两个拆分器添加到sizer中,因为它们不是Windows层次结构中的兄弟。所以你有分离器,然后是其中一个分区中的另一个分离器。 Sizer不会帮助你,因为sizer直接与sizer内的窗口一起使用,但是sizer中只有一个窗口(self.splitter),另一个(self.splitter2)位于self.splitter中。因此,尺寸必须在分离器本身内发生。您必须处理Frame的OnSize事件,并在那里调整内部分割器的大小。

编辑:添加了代码。

class SplitterFrame (wx.Frame):
    def __init__(self):
        #Create a master window
        wx.Frame.__init__(self,None,title = 'some frame')
        self.splitter = wx.SplitterWindow(self,-1, style = wx.SP_LIVE_UPDATE)
        self.splitter2 = wx.SplitterWindow(self.splitter,-1, style = wx.SP_LIVE_UPDATE)
        self.splitter.SetMinimumPaneSize(20)
        self.splitter2.SetMinimumPaneSize(20)

        self.panel1 = wx.Panel(self.splitter,-1)
        self.panel1.SetBackgroundColour(wx.WHITE)

        self.panel2 = wx.Panel(self.splitter2,-1)
        self.panel2.SetBackgroundColour(wx.WHITE)

        self.panel3 = wx.Panel(self.splitter2, -1)
        self.panel3.SetBackgroundColour(wx.WHITE)

        #Splitter window attributes
        self.splitter2.SplitVertically(self.panel2,self.panel3, 100)
        self.splitter.SplitVertically(self.panel1,self.splitter2, 100)
        self.splitter.SetSashGravity(0)
        self.splitter2.SetSashGravity(1)
        self.Centre()
        self.Layout()
        self.Maximize(True)
        self.Bind(wx.EVT_SIZE, self.OnSize)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.splitter,2,wx.ALL|wx.EXPAND)
        self.SetSizer(sizer)

    def OnSize(self, evt):
        evt.Skip()
        # here you will change the sash positions to your liking
        self.splitter.SetSashPosition(100,redraw = True)
        self.splitter2.SetSashPosition(200,redraw = True)