2013-08-06 30 views
0

我有一個wxpython網格大小調整位圖按鈕的子列表。我只想創建一次主列表,因爲創建這些按鈕需要相當長的時間,因此我不想銷燬它們。我的想法是以某種方式從sizer中刪除所有按鈕,創建一個新的我想讓sizer包含的按鈕列表,然後使用sizer的AddMany方法。如何對wxsizer進行排序或刪除項目而不銷燬它們?

如果我不能在不損壞它們的情況下從sizer中刪除按鈕,那麼是否有一種方法可以使用sizer的Show方法來隱藏一些時間,但是隨後sizer會調整以填補空白?當我把它們藏起來時,我現在所能做的就是讓它們消失並留下一個空隙。我需要將下一個項目調整到差距的位置。

也有一種方法來排序網格sizer的項目列表?

感謝您提供任何幫助。

回答

0

您不能對sizer項目進行排序。當然,編寫你自己的函數是可能的,但是它無論如何都會使用wxSizer::Detach()Insert()

+0

謝謝,這是我最終做的。花了一段時間才意識到,雖然我分開之前我需要隱藏他們的物品,否則他們會保持可見但不受sizer的影響。 – phimath

0

所以我發現分離方法就是我要找的!我仍然有興趣知道如何對sizer的項目列表進行排序,而不必分離所有項目,然後重新附加子列表。

0

您應該能夠調用sizer父級的佈局方法,這將使其重新計算顯示的項目。

0

獲取按鈕排序有點棘手,但關鍵是找到要排序的東西。您可以使用按鈕標籤或按鈕名稱。我和後者一起去了。以下代碼還演示瞭如何顯示/隱藏按鈕:

import random 
import wx 

######################################################################## 
class MyPanel(wx.Panel): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self, parent): 
     """Constructor""" 
     wx.Panel.__init__(self, parent) 

     self.mainSizer = wx.BoxSizer(wx.VERTICAL) 
     hSizer = wx.BoxSizer(wx.HORIZONTAL) 

     for item in range(10): 
      val = random.choice(range(10000,99999)) 
      label = "Button %s" % val 
      name = "btn%s" % val 
      btn = wx.Button(self, label=label, name=name) 
      self.mainSizer.Add(btn, 0, wx.ALL|wx.CENTER, 5) 

     toggleBtn = wx.Button(self, label="Hide/Show Some Buttons") 
     toggleBtn.Bind(wx.EVT_BUTTON, self.onHideShow) 
     hSizer.Add(toggleBtn, 0, wx.ALL, 5) 

     sortBtn = wx.Button(self, label="Sort buttons") 
     sortBtn.Bind(wx.EVT_BUTTON, self.onSort) 
     hSizer.Add(sortBtn, 0, wx.ALL, 5) 

     self.mainSizer.Add(hSizer, 0, wx.ALL|wx.CENTER, 5) 
     self.SetSizer(self.mainSizer) 

    #---------------------------------------------------------------------- 
    def onHideShow(self, event): 
     """ 
     Hide/Show the buttons 
     """ 
     children = self.mainSizer.GetChildren() 
     for child in children: 
      widget = child.GetWindow() 
      if isinstance(widget, wx.Button): 
       if widget.IsShown(): 
        widget.Hide() 
       else: 
        widget.Show() 

    #---------------------------------------------------------------------- 
    def onSort(self, event): 
     """ 
     Sort the buttons 
     """ 
     children = self.mainSizer.GetChildren() 
     buttons = [] 
     for child in children: 
      widget = child.GetWindow() 
      if isinstance(widget, wx.Button): 
       buttons.append(widget) 
       self.mainSizer.Detach(widget) 

     sortedBtns = sorted([btn for btn in buttons], key = lambda y: y.GetName()) 
     # need to prepend them in reverse order to keep the two control buttons on the bottom 
     sortedBtns.reverse() 
     for btn in sortedBtns: 
      self.mainSizer.Prepend(btn, 0, wx.ALL|wx.CENTER, 5) 
     self.Layout() 

######################################################################## 
class MyFrame(wx.Frame): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, None, title="Test", size=(600,800)) 
     panel = MyPanel(self) 
     self.Show() 

if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MyFrame() 
    app.MainLoop() 
相關問題