2012-12-11 19 views
6

Mam następujący kod, aby dodać 6 przycisków do BoxSizerwxPython, starając się usunięcie wszystkich przycisków z klasyfikatorze, zawsze pozostawia jeden pozostały

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

W mojej metody onWordSelect Próbuję usunąć wszystkie przyciski Stworzyłem w Sizer, aby móc odtworzyć nowe przyciski. Mój problem polega na tym, że wszystkie przyciski zostają usunięte, z wyjątkiem ostatniego.

Oto mój kod do usuwania przycisków:

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

Podczas sprawdzania len(self.sizer.GetChildren()) zwraca 0, ale ostatni guzik jest nadal widoczny na ekranie.

Odpowiedz

4

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

Ze względów historycznych wywołanie tej metody z parametrem wx.Window jest depreacted, ponieważ nie będzie w stanie zniszczyć okno, ponieważ jest własnością jego rodzica. Zamiast tego należy użyć narzędzia Odłącz.

Usunięto elementy z klasyfikatorze ale nadal istnieją, są drukowane jedna nad drugą: dodać jedną linię w swoim pętli destroy lub hide je i powinno być dobrze.

3

Po dokładnym przejrzeniu dokumentacji odkryłem, że najprostszym sposobem usunięcia wszystkich elementów sterujących jest użycie self.sizer.DeleteWindows() zamiast usuwania każdego przycisku pojedynczo w pętli.

+0

To działało jak urok! – otterb

0

Obok odpowiedzi Kraymer'a, przykład przełączania dziennika. Dzięki, 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

Dla jasności kraymer na niszczą komentarz, oto jak I rozwiązać problem miałem mający:

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