面板内的滚动面板未调整大小

1 投票
1 回答
1829 浏览
提问于 2025-04-17 04:29

我一直在琢磨这个问题,但就是搞不明白。

我有一个面板里面有一个可以滚动的面板,但这个外面的面板却不能滚动。

self.panel = wx.Panel(self, wx.ID_ANY)
self.stepPanel = wxscrollpanel.ScrolledPanel(self.panel, -1, style=wx.EXPAND)
self.stepPanel.SetupScrolling(scrollToTop=False)

sizer = wx.BoxSizer(wx.VERTICAL)
self.stepPanel.SetSizerAndFit(sizer)

更新函数是这样的……

sizer = self.stepPanel.GetSizer()
# Add some widgets
self.stepPanel.SetSizerAndFit(sizer)

当用户点击按钮时,我会往布局里添加一些控件……我试过自动布局、FitInside()、Update()……但就是无法让这个可以滚动的步骤面板在我添加控件后滚动。

编辑:补充更多信息……

这里的想法是,self.panel的顶部有一个不滚动的区域(就是另一个面板),而下面的部分是可以滚动的(self.stepPanel),但看起来这个步骤面板的内容超出了self.panel可见的区域。

编辑:问题解决了,见评论。

1 个回答

2

我想我明白了。像往常一样,当你添加或删除小部件时,需要在父级上调用布局,这里指的是正在添加新小部件的滚动面板。你还需要调用SetupScrolling(),这样它才能重新计算空间有多少,以及是否需要滚动条。下面是一个在Windows上对我有效的例子:

import wx
import wx.lib.scrolledpanel as scrolled

########################################################################
class MyForm(wx.Frame):

    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial", size=(200,500))

        # Add a panel so it looks the correct on all platforms
        self.panel = wx.Panel(self, wx.ID_ANY)

        # --------------------
        # Scrolled panel stuff
        self.scrolled_panel = scrolled.ScrolledPanel(self.panel, -1, 
                                 style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER, name="panel1")
        self.scrolled_panel.SetAutoLayout(1)
        self.scrolled_panel.SetupScrolling()

        words = "A Quick Brown Insane Fox Jumped Over the Fence and Ziplined to Cover".split()
        self.spSizer = wx.BoxSizer(wx.VERTICAL)
        for word in words:
            text = wx.TextCtrl(self.scrolled_panel, value=word)
            self.spSizer.Add(text)
        self.scrolled_panel.SetSizer(self.spSizer)
        # --------------------

        btn = wx.Button(self.panel, label="Add Widget")
        btn.Bind(wx.EVT_BUTTON, self.onAdd)

        panelSizer = wx.BoxSizer(wx.VERTICAL)
        panelSizer.AddSpacer(50)
        panelSizer.Add(self.scrolled_panel, 1, wx.EXPAND)
        panelSizer.Add(btn)
        self.panel.SetSizer(panelSizer)

    #----------------------------------------------------------------------
    def onAdd(self, event):
        """"""
        print "in onAdd"
        new_text = wx.TextCtrl(self.scrolled_panel, value="New Text")
        self.spSizer.Add(new_text)
        self.scrolled_panel.Layout()
        self.scrolled_panel.SetupScrolling()

# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm().Show()
    app.MainLoop()

撰写回答