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)

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

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

licensed under cc by-sa 3.0 with attribution.