考虑以下虚拟应用程序:
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
调用会导致滚动位置跳回顶部。对于我的应用程序来说,这将是不可接受的行为。如何执行以下操作之一?
布置滚动区域而不跳到顶部
仅当内容区域实际更改了大小时才调用
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()