2012-12-11 42 views
6

I私はすべてのボタンを削除しようとしている私のonWordSelect方法でBoxSizerwxPythonのは、サイザーからすべてのボタンを削除しようと、常に1が残ったまま

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

に6つのボタンを追加するには、次のコードを持っています私は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から

答えて

4

:それは親が所有しているので、窓を破壊することができなくなりますようwx.Windowパラメータを指定してこのメ​​ソッドを呼び出すと歴史的な理由

は、depreactedされます。代わりにデタッチを使用する必要があります。

あなたはサイザーから要素を削除しますが、彼らはまだ存在し、他の上で1つの印刷されている:それらをdestroyにあなたのループ内の1行を追加したり、hide、それは良いことがあります。

3

ドキュメントを掘り下げた後、すべてのコントロールを削除する最も簡単な方法は、ループ内の各ボタンを個別に削除する代わりに、self.sizer.DeleteWindows()を使用することです。

+0

これは魅力のように働きました! – otterb

0

kraymerの回答に加えて、ログを切り替える例もあります。ありがとう、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

、ここで私は私が持っていた問題を解決する方法は次のとおりです。

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() 
関連する問題