wxPython碰上碰撞

时间:2016-02-24 23:36:12

标签: 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 = 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()

应用程序启动很好,并且第一次成功执行rebuild()方法。然后按下添加按钮,我在控制台中看到以下内容:

SetSizer
Fit

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

1 个答案:

答案 0 :(得分:0)

将button_sizer添加到新的父sizer似乎会导致崩溃。虽然似乎没有合理的原因。

如果你编辑你的类以匹配以下内容,它可以工作,并按预期添加项目,而不会崩溃:

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()

希望有助于解决您的问题。

迈克尔