如何在 wxPython 中删除 StaticBox?

How can I remove a StaticBox in wxPython?

我有一个应用程序,我希望在其中删除 sizer 中的所有小部件。除了顽固地保留的 StaticBox 之外,这是有效的。我能做什么?它似乎不像一个 sizer,也不像一个普通的小部件。

import wx

class MainFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(None, *args, **kwargs)

        self.panel = MainPanel(self)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.panel)
        self.SetSizer(sizer)
        self.Center()
        self.Show()


class MainPanel(wx.Panel):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)

        self.widget_sizer = self._widget_sizer()
        cmd_clear = wx.Button(self, id=wx.ID_CLEAR)
        cmd_clear.Bind(wx.EVT_BUTTON, self.clear_widgets)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.widget_sizer)
        sizer.Add(cmd_clear)
        self.SetSizer(sizer)

    def clear_widgets(self, event):
        self._delete_widgets(self.widget_sizer)

    def _widget_sizer(self):
        txt_test = wx.TextCtrl(self)

        test_box = wx.StaticBox(parent=self, label="Box Label")
        test_sizer = wx.StaticBoxSizer(box=test_box, orient=wx.VERTICAL)
        chk_test = wx.CheckBox(self, label='Check test')
        test_sizer.Add(chk_test)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(txt_test)
        sizer.Add(test_sizer)
        return sizer

    def _delete_widgets(self, sizer):
        for child in sizer.GetChildren():
            if child.IsSizer():
                self._delete_widgets(child.GetSizer())
            else:
                child.GetWindow().Destroy()

if __name__ == '__main__':
        wx_app = wx.App()
        MainFrame()
        wx_app.MainLoop()

我使用 wx.lib.inspection.InspectionTool 查看了您的代码,似乎 staticBox 不是来自您的 sizer 的 child。

StaticBox 保留,因为它的 parent 是你的 MainPanel

我尝试了创建 StaticBox 的不同方式(包括让它由 BoxSizer 本身创建,然后使用 test_sizer.Add(test_sizer.GetStaticBox()) 将其“手动”添加到 Sizer 但它不起作用:

wx._core.wxAssertionError: C++ assertion ""!m_containingSizer"" failed at /home/wxpy/wxPython-4.1.0/ext/wxWidgets/src/common/wincmn.cpp(2490) in SetContainingSizer(): Adding a window already in a sizer, detach it first!

BoxSizer 始终作为 child“附加”到 panel,并且永远不是 SizerItem.

的实例

这有点奇怪...对我来说它看起来像是一个错误。可能值 reporting it.

我看到您删除它的唯一解决方法是使用以下方法单独访问它: panel.GetChildren() 并测试 child 是否为专有名称或可能是 id...