2014-01-29 62 views
2

我纔能有一個自動佈局(如縮略圖圖庫)採用了WrapSizer這樣的(見在截圖左):ScrolledPanel只有垂直滾動條和WrapSizer

enter image description here

我想如果有兩個很多的元素,則在面板上添加一個(僅限垂直) - ScrollBar(請參見右側截圖)。 如何使用WrapSizer將這種垂直滾動條添加到面板?


我試圖通過混合WrapSizerScrolledPanel,但我不能得到所需的佈局。

class MyPanel(scrolled.ScrolledPanel): 
    def __init__(self, parent): 
     scrolled.ScrolledPanel.__init__(self, parent) 
     self.SetBackgroundColour('#f8f8f8') 
     sizer = wx.WrapSizer() 
     self.SetupScrolling() 

     # add some widgets btn1, btn2, etc. in the WrapSizer 
     sizer.Add(btn1, 0, wx.ALL, 10) 
     sizer.Add(btn2, 0, wx.ALL, 10) 

回答

1

解決方案:

滾動面板虛擬尺寸的寬度重置爲可顯示的尺寸。

import wx 
import wx.lib.scrolledpanel as scrolled 

class MyPanel(scrolled.ScrolledPanel): 
    def __init__(self, parent): 
     scrolled.ScrolledPanel.__init__(self, parent, style=wx.VSCROLL) 
     self.SetBackgroundColour('#f8f8f8') 
     self.sizer = wx.WrapSizer() 
     self.SetupScrolling(scroll_x = False) 
     self.parent = parent 

     self.addButton(self.sizer , 10) 
     self.SetSizer(self.sizer) 
     self.Bind(wx.EVT_SIZE, self.onSize) 

    def onSize(self, evt): 
     size = self.GetSize() 
     vsize = self.GetVirtualSize() 
     self.SetVirtualSize((size[0], vsize[1])) 

     evt.Skip() 

    def addButton(self, sizer, num): 
     for i in range(1, num): 
      btn =wx.Button(self, wx.ID_ANY, "btn"+str(i), wx.DefaultPosition, wx.DefaultSize, 0) 
      sizer.Add(btn, 0, wx.ALL, 10) 

if __name__=='__main__': 
    app = wx.App(redirect=False) 
    frame = wx.Frame(None) 
    MyPanel(frame) 
    frame.Show() 
    app.MainLoop() 
+0

好吧,但是當你增加寬度,那麼如果你減少寬度,面板/ sizer不會調整到較小...(它保持放大)任何想法? – Basj

+0

是的,這是....經過一番嘗試,我找到了一個解決方案。答覆修改。 –

+0

Waw!非常感謝你。 – Basj

0

它看起來像你剛纔忘了,包括

self.SetSizer(sizer) 

由於WrapSizer採用整體框架,我認爲這會工作。此外,而不是設置滾動,您可以使用

self.SetScrollRate(horiz, vert) 

來指定滾動的增量(以像素爲單位,我認爲),並應該工作。

雖然現在我不能在這裏測試它,但WrapSizers有點奇怪 - 它們有時無法計算出它們的正確尺寸。您可能需要將其包裝在BoxSizer中,然後轉向其他方向。