【问题标题】:Sizers for wx.SplitterWindow not working wxPythonwx.SplitterWindow 的 Sizer 不工作 wxPython
【发布时间】:2015-10-25 00:43:45
【问题描述】:

所以我有三个拆分器窗口,我正在尝试使用大小调整器,以便它们在调整大小等时表现正常。这是我现在拥有的代码。它不工作。

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)

有人可以告诉我如何应用正确的尺寸器吗?我对尺寸器一点也不擅长,所以我只是使用了上面的那些,因为我在这里找到了它们 [wxPython Splitter windows and Panels.

【问题讨论】:

    标签: wxpython sizer


    【解决方案1】:

    您不能将两个拆分器都添加到 sizer 中,因为它们不是窗口层次结构中的兄弟。所以你有分离器,然后是其中一个面板中的另一个分离器。 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)
    

    【讨论】:

    • 你能告诉我你所说的代码版本吗?我只是不擅长这个抱歉:(
    • 感谢您的回答。很抱歉这么晚才接受我没有收到通知:(
    • 我有一个类似的案例,我没有使用 evt.Skip() 恰好是罪魁祸首,似乎这很关键。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 2012-12-10
    相关资源
    最近更新 更多