wxPython,尝试从sizer中删除所有按钮,总是剩下一个

问题描述 投票:6回答:5

我有以下代码将4个按钮添加到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,但最后一个按钮仍然可以在屏幕上看到。

python wxpython
5个回答
4
投票

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

由于历史原因,不推荐使用wx.Window参数调用此方法,因为它不能销毁窗口,因为它由其父窗口拥有。你应该使用Detach。

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


3
投票

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


0
投票

继kraymer的答案,切换日志的一个例子。谢谢,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()

0
投票

为了清楚kraymer的破坏评论,这里是我如何解决我遇到的问题:

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

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()
© www.soinside.com 2019 - 2024. All rights reserved.