考虑以下虚拟应用程序:
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
答案 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()