如何在 wxPython 中的 ScrollPanel 中执行 FoldPanelBar?

How to do FoldPanelBar inside ScrollPanel in wxPython?

我尝试在 ScrollPanel 中做一个可折叠的 FoldPanelBar。但它没有加载 FoldPanelBar 的内容。折叠面板内的列表控件 UI 甚至没有加载。我尝试用普通面板替换,但结果是一样的。如果我在这里遗漏了什么,你能告诉我吗?

import wx
from wx.lib import scrolledpanel
import wx.lib.agw.foldpanelbar as fpb

class MyPanel(wx.lib.scrolledpanel.ScrolledPanel):

    def __init__(self, parent):
        wx.lib.scrolledpanel.ScrolledPanel.__init__(self, parent=parent, size=parent.GetSize(), style = wx.ALL|wx.EXPAND)
        self.SetAutoLayout(1)
        self.SetupScrolling()

        csStyle = fpb.CaptionBarStyle()
        csStyle.SetFirstColour(wx.Colour(190, 190, 190, 255))
        csStyle.SetSecondColour(wx.Colour(167, 232, 146, 255))
        csStyle.SetCaptionFont(wx.Font(9, wx.DEFAULT, wx.NORMAL, wx.BOLD))

        m_pnl = fpb.FoldPanelBar(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize,
                            fpb.FPB_VERTICAL)

        item = m_pnl.AddFoldPanel("Set 1", collapsed=True, cbstyle=csStyle)

        self.listContainer = wx.ListCtrl(item)
        self.listContainer.InsertColumn(0, 'Column1', width=250)
        self.listContainer.InsertColumn(1, 'Column2', width=150)
        self.listContainer.InsertColumn(2, 'Column3')

        m_pnl.AddFoldPanelWindow(item, self.listContainer)
        btnGo = wx.Button(item, wx.ID_ANY, "Go", size=(50,-1))
        m_pnl.AddFoldPanelWindow(item, btnGo)

        item = m_pnl.AddFoldPanel("Set 2", collapsed=True, cbstyle=csStyle)
        self.listContainer2 = wx.ListCtrl(item, style=wx.LC_REPORT)
        self.listContainer2.InsertColumn(0, 'Column1', width=250)
        self.listContainer2.InsertColumn(1, 'Column2', width=150)
        self.listContainer2.InsertColumn(2, 'Column3')

        m_pnl.AddFoldPanelWindow(item, self.listContainer2)

        self.pnl = m_pnl


if __name__ == '__main__':
    app = wx.App(False)
    frame = wx.Frame(None, size=(650, 400), style=wx.DEFAULT_FRAME_STYLE)
    panel = MyPanel(frame)
    frame.Show()
    app.MainLoop()

我发现您的示例存在两个问题。首先,列不会在 wx.ListCtrl 的正常列表模式下显示。设置LC_REPORT样式如下:

    self.listContainer = wx.ListCtrl(item, style=wx.LC_REPORT)

其次,这里没有适当的 layouting/sizing 发生。

# ...
panel = MyPanel(frame)
# Add sizer information for the scrolled panel
szmain = wx.BoxSizer(wx.VERTICAL)
szmain.Add(panel.pnl, 1, wx.EXPAND|wx.ALL, 4)
panel.SetSizer(szmain)

通过在 wxPython classic 3.0.2 (MSW) 上应用这些更改,至少控件的布局可以填充框架。