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.