如何在wxPython的sizer中任意添加元素?wxGridBagSizer添加失败求助
问题原因
动态修改wxSizer内的子控件后,必须手动触发布局刷新逻辑,你当前的代码只完成了控件的添加操作,没有通知sizer和父容器重新计算布局、重绘界面,因此新添加的元素不会正常显示。
修复步骤
- 优化控件清理逻辑:旧控件从sizer分离后直接销毁,避免残留控件占用内存
- 完成新控件批量添加后,依次调用网格布局和面板的布局刷新方法
修复后完整代码
import wx import random 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() def on_reset_click(self, event): self.panel.numbers_fill(random.randint(1, 20)) class MainPanel(wx.Panel): def __init__(self, parent, *args, **kwargs): super().__init__(parent, *args, **kwargs) cmd_reset = wx.Button(self, id=wx.ID_OK, label="重置") cmd_reset.Bind(wx.EVT_BUTTON, parent.on_reset_click) self.number_sizer = wx.GridBagSizer(5, 5) self.numbers_fill(random.randint(1, 20)) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(cmd_reset, flag=wx.ALL, border=10) sizer.Add(self.number_sizer, flag=wx.ALL, border=10) self.SetSizer(sizer) def numbers_fill(self, max_integer): self.clear_sizer(self.number_sizer) for index, _ in enumerate(range(max_integer)): row = int(index / 5) column = index % 5 lbl_number = wx.StaticText(self, label=str(_)) self.number_sizer.Add(lbl_number, pos=(row, column)) # 新增布局刷新逻辑 self.number_sizer.Layout() self.Layout() @staticmethod def clear_sizer(sizer): for child in sizer.GetChildren(): sizer_child = child.GetWindow() # 直接销毁旧控件,避免内存残留 if sizer_child: sizer_child.Destroy() sizer.Detach(sizer_child) if __name__ == '__main__': wx_app = wx.App() MainFrame(size=(400,300)) wx_app.MainLoop()
内容的提问来源于stack exchange,提问作者Psionman
相关产品推荐
相关产品推荐

