【问题标题】:ScrolledPanel inside Panel not sizing面板内的 ScrolledPanel 未调整大小
【发布时间】:2011-10-17 15:06:35
【问题描述】:

我已经玩了一段时间了,但似乎无法弄清楚。 self.panel = wx.Panel(self, wx.ID_ANY)

我在不滚动的面板中有一个 scrolledPanel。

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)

稍后当用户单击按钮时,我将小部件添加到 sizer ...我尝试了自动布局、FitInside()、Update() ... 添加小部件时似乎无法滚动此 stepPanel。

编辑:添加更多信息...

这里的想法是 self.panel 在顶部有一个不滚动的区域(只是另一个面板),而下部滚动(self.stepPanel),但似乎 stepPanel 是从可视区域中生长出来的self.panel 的区域

编辑:已解决见评论。

【问题讨论】:

  • 已解决:SizerAndFit 是问题所在,我移除了 Fit,一切正常。

标签: python wxpython


【解决方案1】:

我想我明白了。像往常一样,在添加或删除小部件时,您需要在父级上调用 Layout,在这种情况下,父级是正在获取新子级的滚动面板。您还必须调用 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()

【讨论】:

  • 我从没想过我需要在添加小部件后再次调用SetupScrolling! (我在 Windows 和 MacOS 上的体验与您的相同,但它对我有用,无需在 Linux 上执行额外步骤)
  • 是的。 GUI 工作通常需要经过反复试验才能以您想要的方式工作。