2012-12-11 22 views
6

Tôi có đoạn code sau để thêm 6 nút để một BoxSizerwxPython, cố gắng để loại bỏ tất cả các nút từ một sizer, luôn luôn để lại một còn lại

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

Trong phương pháp onWordSelect của tôi, tôi đang cố gắng để loại bỏ tất cả các nút Tôi đã tạo trên Sizer, để tôi có thể tạo lại các nút mới. Vấn đề của tôi là tất cả các nút bị xóa trừ nút cuối cùng.

Đây là mã của tôi để loại bỏ các nút:

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

Khi kiểm tra len(self.sizer.GetChildren()) nó trả 0, nhưng nút cuối cùng là vẫn hiển thị trên màn hình.

Trả lời

4

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

Vì lý do lịch sử gọi phương pháp này với một tham số wx.Window được depreacted, vì nó sẽ không thể để tiêu diệt các cửa sổ vì nó thuộc sở hữu của mẹ. Bạn nên sử dụng Detach thay thế.

Bạn loại bỏ các yếu tố từ sizer nhưng họ vẫn tồn tại, được in một trong khác: thêm một dòng trong vòng lặp của bạn để destroy hoặc hide họ và nó nên được tốt.

3

Sau khi thực hiện một chút thông qua tài liệu, tôi đã tìm thấy cách dễ nhất để xóa tất cả các điều khiển là sử dụng self.sizer.DeleteWindows() thay vì xóa từng nút riêng lẻ trong một vòng lặp.

+0

này làm việc như một nét duyên dáng! – otterb

0

Thêm vào câu trả lời của kraymer, ví dụ về chuyển đổi nhật ký. Cảm ơn, 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

Để rõ ràng của kraymer của phá hủy nhận xét, đây là cách tôi giải quyết một vấn đề tôi gặp phải:

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() 
Các vấn đề liên quan