更新ScrolledPanel的大小而不滚动到顶部

时间:2014-02-27 19:47:38

标签: wxpython wxwidgets

考虑以下虚拟应用程序:

import wx
from wx.lib.scrolledpanel import ScrolledPanel


class MyPanel(ScrolledPanel):
    def __init__(self, parent):
        ScrolledPanel.__init__(self, parent, size=(128, 64))

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(self.sizer)

        self.SetAutoLayout(1)
        self.SetupScrolling(scroll_x=False, scroll_y=True)

    def add_text_line(self, text):
        self.sizer.Add(wx.StaticText(self, label=text))
        self.sizer.Layout()
        self.SetupScrolling(scroll_x=False, scroll_y=True)


class MainWindow(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, title='Test Window')

        self.line_number = 1

        sizer = wx.BoxSizer(wx.VERTICAL)

        button = wx.Button(self, label='Add a row')
        self.Bind(wx.EVT_BUTTON, self.add_row, button)
        sizer.Add(button)

        self.panel = MyPanel(self)
        sizer.Add(self.panel)

        self.SetSizer(sizer)

    def add_row(self, _):
        self.panel.add_text_line('Line number ' + str(self.line_number))
        self.line_number += 1


if __name__ == '__main__':
    app = wx.App(False)
    MainWindow(None).Show()
    app.MainLoop()

它包含ScrolledPanel,当用户按下按钮时,动态添加内容。 ScrolledPanel似乎更新了它的大小和布局,但是如果我在列表中间滚动并按下按钮,SetupScrolling调用会使滚动位置跳回到顶部。这对我的应用程序来说是不可接受的行为。我该如何做以下其中一项?

  1. 布置滚动区域而不跳到顶部

  2. 仅在内容区域实际更改了尺寸时调用SetupScrolling

1 个答案:

答案 0 :(得分:2)

感谢关于类似问题的this answer,我发现我需要调用FitInside而不是SetupScrolling来更新滚动条。这不会影响滚动位置。

我需要修改我的示例代码,将MyPanel.add_text_line更改为:

    def add_text_line(self, text):
        self.sizer.Add(wx.StaticText(self, label=text))
        self.sizer.Layout()
        self.FitInside()