从wx面板中删除控件的最佳方法

时间:2010-02-19 13:31:13

标签: wxpython

在从wx.Panel中删除控件方面,您会建议什么? 我有一个控件的列表列表,如:

['cb':wx.CheckBox,'label':wx.StaticText,'input':wx.TextCtrl]

我试图在发生某些事情时删除它们,以便我可以添加新的。

我这样做的方式是:

    # remove previous controls
    for c in self.controls:
        c['cb'].Destroy()
        c['label'].Destroy()
        c['input'].Destroy()
        self.controls.remove(c)

但似乎我总是最终拥有len(self.controls)> 0原因不明

那么从面板中删除控件的正确方法是什么?我应该在持有控件的面板上做些什么吗?

1 个答案:

答案 0 :(得分:1)

您正在尝试从正在迭代的相同列表中删除元素,这是创建不良副作用的可靠方法。例如举一个简单的例子

l = range(10)
for a in l:
    l.remove(a)
print l

您认为输出应该是什么?您似乎要删除所有项目,输出应为'[]',但输出为

[1, 3, 5, 7, 9]

因为通过删除项目来改变内部索引以进行交互,所以您应该在副本上执行此操作,例如

l = range(10)
for a in l[:]:
    l.remove(a)
print l

但是在您知道删除所有项目的情况下,只需在循环后将列表设置为空,例如

for c in self.controls:
    c['cb'].Destroy()
    c['label'].Destroy()
    c['input'].Destroy()

self.controls = []