wxPython合身碰撞

wxPython合身碰撞,wxpython,Wxpython,我正在尝试创建一个wxPython应用程序,它基于数据模型动态创建一些小部件和大小器,如下所示: import wx class FooWidget(wx.Panel): """ Displays information about an object in the data model. """ def __init__(self, parent, idx): wx.Panel.__init__(self, parent) sizer = w

我正在尝试创建一个wxPython应用程序,它基于数据模型动态创建一些小部件和大小器,如下所示:

import wx

class FooWidget(wx.Panel):
    """ Displays information about an object in the data model. """
    def __init__(self, parent, idx):
        wx.Panel.__init__(self, parent)

        sizer = wx.BoxSizer(wx.VERTICAL)
        self.label = wx.StaticText(self, label=str(idx))
        sizer.Add(self.label)
        self.SetSizer(sizer)

class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None)
        self.model = [0]

        self.button_sizer = wx.BoxSizer(wx.HORIZONTAL)
        add_button = wx.Button(self, label="add")
        add_button.Bind(wx.EVT_BUTTON, self.add)
        self.button_sizer.Add(add_button)

        self.rebuild()

    def add(self, evt):
        self.model.append(len(self.model))
        self.rebuild()
        print 'rebuild complete'

   def rebuild(self):
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.button_sizer,1)

        widget_sizer = wx.BoxSizer(wx.HORIZONTAL)
        for idx in self.model:
            widget_sizer.Add(FooWidget(self, idx), 1)
        sizer.Add(widget_sizer,1)

        print 'SetSizer'
        self.SetSizer(sizer)
        print 'Fit'
        self.Fit()
        print 'Layout'
        self.Layout()

if __name__ == '__main__':
    app = wx.App(False)
    frame = MainFrame()
    frame.Show()
    app.MainLoop()
应用程序将启动fine,并在第一次通过时成功执行rebuild()方法。但是,按下add按钮后,我在控制台中看到以下内容:

SetSizer
Fit

然后应用程序挂起几秒钟,然后崩溃而不报告错误。我的真实数据模型比简单的python列表要复杂一些,因此查询模型中应该显示的内容要比在视图中维护所有状态容易得多。如何更改此设置,以便在应用程序不崩溃的情况下动态更改主窗口的大小调整器?

将按钮大小调整器添加到新的父大小调整器似乎会导致崩溃。尽管似乎没有合理的理由

如果编辑类以匹配以下内容,则该类将正常工作,并按预期添加项,而不会发生崩溃:

class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None)
        self.model = [0]

        self.add_button = wx.Button(self, label="add")
        self.add_button.Bind(wx.EVT_BUTTON, self.add)

        self.rebuild()

    def add(self, evt):
        self.model.append(len(self.model))
        self.rebuild()
        print 'rebuild complete'

    def rebuild(self):
        sizer = wx.BoxSizer(wx.VERTICAL)

        button_sizer = wx.BoxSizer(wx.HORIZONTAL)

        button_sizer.Add(self.add_button)

        sizer.Add(button_sizer,1)

        widget_sizer = wx.BoxSizer(wx.HORIZONTAL)
        for idx in self.model:
            widget_sizer.Add(FooWidget(self, idx), 1)
        sizer.Add(widget_sizer,1)

        print 'SetSizer'

        self.SetSizer(sizer)
        print 'Fit'
        self.Fit()

        print 'Layout'
        self.Layout()
希望这有助于解决您的问题


Michael

这解决了问题,谢谢。有什么理由期待这种行为吗?我不确定。我想我不久前试过类似的东西,结果也失败了。我的猜测是:一旦分配了sizer对象,它就不能被分配给另一个sizer。但我不知道这是否正确。