ScrolledPanel with vertical scrollbar only and WrapSizer

倾然丶 夕夏残阳落幕 提交于 2019-12-30 10:22:30

问题


I uses a WrapSizer in order to have an automatic layout (as thumbnail gallery) like this (see screenshot on the left) :

I would like that if there are two many elements, a (vertical only)-ScrollBar is added on the panel (see right screenshot). How to add such a vertical scrollbar to a panel using a WrapSizer?


I tried by mixing WrapSizer and ScrolledPanel, but I cannot get the desired layout.

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:


Solution:

reset the width of the scroll panel virtual size to the displayable size.

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()



回答2:


It looks like you just forgot to include

self.SetSizer(sizer)

Since the WrapSizer takes the whole frame, I think that will work. Also, instead of SetupScrolling, you can use

self.SetScrollRate(horiz, vert)

to specify the increment (in pixels, i think) of the scroll, and that should work.

I can't test it here right now though, and WrapSizers are a little weird - they sometimes have trouble figuring out their proper size. You may need to wrap it in a BoxSizer going the other direction.



来源:https://stackoverflow.com/questions/21431366/scrolledpanel-with-vertical-scrollbar-only-and-wrapsizer

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!