我使用WrapSizer
来自动布局(如缩略图库)(参见左侧上的截图):
我希望如果有两个元素,则在面板上添加一个(仅垂直) - ScrollBar
(参见右侧屏幕截图)。 如何使用WrapSizer将这样的垂直滚动条添加到面板?
我尝试混合WrapSizer
和ScrolledPanel
,但我无法获得所需的布局。
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)
答案 0 :(得分:4)
解决方案:
将滚动面板虚拟大小的宽度重置为可显示的大小。
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()
答案 1 :(得分:0)
看起来你忘了包含
self.SetSizer(sizer)
由于WrapSizer采用了整个框架,我认为这样可行。此外,您可以使用
代替SetupScrollingself.SetScrollRate(horiz, vert)
指定滚动的增量(以像素为单位),这应该有用。
我现在不能在这里测试,而WrapSizer有点奇怪 - 他们有时很难搞清楚它们的大小。您可能需要将其包装在另一个方向的BoxSizer中。