6

我有以下代码将 6 个按钮添加到 BoxSizer

for word in words:
    btn = wx.Button(self, label=word)
    btn.Bind(wx.EVT_BUTTON, self.onWordSelect)

在我的onWordSelect方法中,我试图删除我在 Sizer 上创建的所有按钮,以便我可以重新创建新按钮。我的问题是所有按钮都被删除了,除了最后一个。

这是我删除按钮的代码:

for child in self.sizer.GetChildren():
    self.sizer.Remove(child.Window)
    self.sizer.Layout()

检查len(self.sizer.GetChildren())时返回0,但最后一个按钮仍然在屏幕上可见。

4

5 回答 5

4

http://wxpython.org/docs/api/wx.Sizer-class.html#Remove

由于历史原因,不推荐使用 wx.Window 参数调用此方法,因为它无法销毁窗口,因为它归其父窗口所有。您应该改用分离。

您从 sizer 中删除了元素,但它们仍然存在,被打印在另一个上:在循环中添加一行到destroyorhide他们,它应该是好的。

于 2012-12-11T07:16:17.163 回答
3

在对文档进行了一些深入研究之后,我发现删除所有控件的最简单方法是使用self.sizer.DeleteWindows()而不是在循环中单独删除每个按钮。

于 2012-12-11T08:01:33.017 回答
0

为了清楚克雷默的破坏评论,这是我解决我遇到的问题的方法:

class myFrame(wx.Frame):
    def__init__(self, title):
        #make the FlexGridSizer specifying only the columns, not the rows
        #make a panel
        #create widgets with the panel as the parent
        #add widgets to the sizer
        self.addLastRow()
        #set the sizer, call layout, etc...

    def addLastRow(self):
        lastBtn = wx.Button(self.myScrolledPanel, -1,"Add New Row", style=wx.BU_EXACTFIT)
        numBlanks = self.numTotalColumns-1
        for i in range(numBlanks):
            self.myFlexGridSizer.AddF(wx.StaticText(self.myScrolledPanel, -1, ''), wx.SizerFlags(0))
        self.myFlexGridSizer.AddF(lastBtn, wx.SizerFlags(0))
        self.Bind(wx.EVT_BUTTON, self.AddNewRowElements, addButton)

    def removeLastRow(self):
        myFlexGridItems = self.myFlexGridSizer.GetChildren()
        for i in range(self.numTotalColumns):
            myFlexGridItems[len(myFlexGridItems)-1].GetWindow().Destroy()

    def AddNewRowElements(self, event):
        self.removeLastRow()
        #add elements
        self.addLastRow()
        self.myFlexGridSizer.Layout()
于 2014-05-10T03:21:23.373 回答
0

除了 kraymer 的回答之外,还有一个切换日志的示例。谢谢,克雷默!

def onToggleLog(self, e):

    self.showlog = not self.showlog

    if self.showlog:
        self.sizer.Add(self.log, 1, wx.EXPAND)
        self.log.Show()

    else:
        self.sizer.Detach(self.log)
        self.log.Hide()

    self.sizer.Layout()
于 2014-01-17T16:57:43.480 回答
0

可以这样做:

buf = []
for word in words:
    btn = wx.Button(self, label=word)
    btn.Bind(wx.EVT_BUTTON, self.onWordSelect)
    buf.append(btn)
......
for n,i in enumerate(buf):
    self.sizer.Hide(buf[n])
    self.sizer.Remove(buf[n])
    self.sizer.Layout()
于 2018-09-18T05:02:54.203 回答