在不滚动到顶部的情况下更新滚动面板的大小



考虑以下虚拟应用程序:

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

多亏了这个类似问题的答案,我发现我需要调用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()

最新更新