我在一个垂直的 BoxSizer 中有几个 CollapsiblePanes。我希望能够在不让它们相互碰撞的情况下扩展和折叠它们。我在 Windows 7 上运行 wxPython 2.8.10.1。

演示问题的可运行示例应用程序如下。

import wx

class SampleCollapsiblePane(wx.CollapsiblePane):
    def __init__(self, *args, **kwargs):
        wx.CollapsiblePane.__init__(self,*args,**kwargs)
        sizer = wx.BoxSizer(wx.VERTICAL)
        for x in range(5):
            sizer.Add(wx.Button(self.GetPane(), label = str(x)))
        self.GetPane().SetSizer(sizer)


class Main_Frame(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)
        self.main_panel = wx.Panel(self)
        sizer = wx.BoxSizer(wx.VERTICAL)
        for x in range(5):
            sizer.Add(SampleCollapsiblePane(self.main_panel, label = str(x)), 1)
        self.main_panel.SetSizer(sizer)


class SampleApp(wx.App):
    def OnInit(self):
        frame = Main_Frame(None, title = "Sample App")
        frame.Show(True)
        frame.Centre()
        return True

def main():
    app = SampleApp(0)
    app.MainLoop()

if __name__ == "__main__":
    main()

最佳答案

文档明确指出在将可折叠 Pane 添加到 sizer 时应该使用 ratio=0。

http://docs.wxwidgets.org/stable/wx_wxcollapsiblepane.html

因此,首先,将此行末尾的 1 更改为 0:

sizer.Add(SampleCollapsiblePane(self.main_panel, label = str(x)), 1)

接下来,将其添加到您的 SampleCollapsiblePane 以强制父框架在 Pane 折叠或展开时重新布局:
def __init__(...):
    ...
    self.Bind(wx.EVT_COLLAPSIBLEPANE_CHANGED, self.on_change)
def on_change(self, event):
    self.GetParent().Layout()

可能有更好的方法,但这就是我目前的工作。我很擅长 wxPython,但之前没有使用过 CollapsiblePanes。

关于python - 展开时将 sizer 中的更多大小分配给 wx.CollapsiblePane,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6589509/

10-12 06:05