sizer.replace()绘制“over”旧的sizercontent

时间:2010-03-25 22:21:55

标签: wxpython wxwidgets

我对wx / python很新,所以请原谅这是不是很愚蠢或不明白。

我用一个新的替换嵌套的sizer,如下面的代码段所示。经过一些修修补补后,一切似乎都解决了,但重新绘制了父母分级。 尽管我的sizer.Layout()

,旧的嵌套sizer的内容仍然保留并被新的sizer内容“涂抹”。

系统设置:
- python 2.5.5.2和2.6.4
- wxpython 2.8

# -*- coding: utf8 -*-

import wx

class Frame(wx.Frame):
def __init__(self):
    wx.Frame.__init__(self, None, wx.ID_ANY, title='test')

class Test(wx.App):
    def OnInit(self):
        frame = Frame()
        self.panel = wx.Panel(frame)
        self.panel.SetBackgroundColour('red')
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        button = wx.Button(self.panel, wx.ID_ANY, 'TEST')

        self.hsizer = wx.BoxSizer(wx.HORIZONTAL)
        self.hsizer.Add(wx.StaticText(self.panel, wx.ID_ANY, 'nacknack'))

        self.sizer.Add(button)
        self.Bind(wx.EVT_BUTTON, self.on_test_button, button)
        self.text = wx.StaticText(self.panel, wx.ID_ANY, 'FOOO')
        self.sizer.Add(self.text)
        self.sizer.Add(self.hsizer)
        self.panel.SetSizer(self.sizer)
        frame.Show()
        return True

    def on_test_button(self, evt):
        tmpsizer = wx.BoxSizer(wx.VERTICAL)
        tmpsizer.Add(self.makesizer())
        tmpitem = tmpsizer.GetChildren()[0]

        self.sizer.Replace(2, tmpitem)
        self.sizer.Layout()

    def makesizer(self):
        testsizer = wx.BoxSizer(wx.HORIZONTAL)
        testsizer.Add(wx.StaticText(self.panel, wx.ID_ANY, 'testsizer'))
        return testsizer

    if __name__ == '__main__':
        app = Test()
        app.MainLoop()

1 个答案:

答案 0 :(得分:0)

查看完代码后(并不容易 - 请考虑下次格式化不同 - 可能将self.sizer.add函数分组)我认为我发现了你的错误:

当您在sizer上调用Replace时,被替换的项目不会被销毁,但不再由sizer管理。您需要隐藏或销毁旧窗口(wx.StaticText

正如wxWidgets文档中提到的那样:

virtual bool Replace (wxWindow *oldwin, wxWindow *newwin, bool recursive=false)     Detaches the given oldwin from the sizer and replaces it with the given newwin.