ScrolledPanel только с вертикальной полосой прокрутки и WrapSizer

Я использую 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)

2 ответа

Решение

Решение:

сбросьте ширину виртуального размера панели прокрутки до отображаемого размера.

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

Похоже, вы просто забыли включить

self.SetSizer(sizer)

Поскольку WrapSizer занимает весь кадр, я думаю, что это будет работать. Также вместо SetupScrolling вы можете использовать

self.SetScrollRate(horiz, vert)

указать приращение (в пикселях, я думаю) прокрутки, и это должно работать.

Я не могу проверить это здесь прямо сейчас, а WrapSizer немного странные - у них иногда возникают проблемы с определением их правильного размера. Возможно, вам придется обернуть его в BoxSizer в другом направлении.

Другие вопросы по тегам