如何在 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...
我有一个应用程序,我希望在其中删除 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...