我有以下代码将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
,但最后一个按钮仍然可以在屏幕上看到。
来自http://wxpython.org/docs/api/wx.Sizer-class.html#Remove:
由于历史原因,不推荐使用wx.Window参数调用此方法,因为它不能销毁窗口,因为它由其父窗口拥有。你应该使用Detach。
你从sizer中删除了元素,但它们仍然存在,一个在另一个上面打印:在你的循环中添加一行到destroy
或hide
它们应该是好的。
在对文档进行一些深入研究之后,我发现删除所有控件的最简单方法是使用self.sizer.DeleteWindows()
而不是在循环中单独删除每个Button。
继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()
为了清楚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()
它可以这样做:
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()