【问题标题】:ScrolledPanel with vertical scrollbar only and WrapSizer仅带有垂直滚动条和 WrapSizer 的 ScrolledPanel
【发布时间】:2014-02-21 06:32:54
【问题描述】:

我使用WrapSizer 来实现这样的自动布局(作为缩略图库)(参见左侧的屏幕截图):

如果有两个很多元素,我希望在面板上添加一个(仅垂直)-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)

【问题讨论】:

    标签: python wxpython wxwidgets sizer


    【解决方案1】:

    你好像忘了包含

    self.SetSizer(sizer)
    

    由于 WrapSizer 占用了整个帧,我认为这会起作用。此外,您可以使用

    代替 SetupScrolling
    self.SetScrollRate(horiz, vert)
    

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

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

    【讨论】:

      【解决方案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()
      

      【讨论】:

      • 好的,但是当你增加宽度时,如果你减小宽度,面板/尺寸不会调整到更小...(它保持放大)有什么想法吗?
      • 哇!非常感谢。
      • 现在还有一个问题...stackoverflow.com/questions/21438844/… ... WrapSizer + Scrollbar 需要很多努力;)
      • 一件小事@Jerry_Y:你知道如何修改top left 边距(以使该元素不会离左上边框太近)吗?
      • 我所知道的是修改元素周围的边框。代码:boxSizer.Add(self.button, 0, wx.BOTTOM|wx.LEFT|wx.RIGHT|wx.TOP, 5);您可以尝试将按钮添加到面板中的 boxSizer 中。选择标志来控制您要修改的内容。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      相关资源
      最近更新 更多