4

我使用 aWrapSizer为了有一个像这样的自动布局(作为缩略图库)(见左边的截图):

在此处输入图像描述

如果有两个很多元素,我希望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)
4

2 回答 2

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()
于 2014-01-29T13:51:48.733 回答
0

看起来你只是忘了包括

self.SetSizer(sizer)

由于 WrapSizer 占据了整个框架,我认为这会起作用。此外,您可以使用而不是 SetupScrolling

self.SetScrollRate(horiz, vert)

指定滚动的增量(我认为以像素为单位),这应该可以工作。

不过我现在不能在这里测试它,而且 WrapSizer 有点奇怪——它们有时很难确定它们的合适尺寸。您可能需要将它包装在一个 BoxSizer 中去另一个方向。

于 2014-01-29T14:55:55.113 回答