ScrolledPanel inside Panel not sizing

一笑奈何 提交于 2019-12-12 23:32:36

问题


I've been toying with this for a while and just can't seem to figure it out. self.panel = wx.Panel(self, wx.ID_ANY)

I have a scrolledPanel inside a panel that does not scroll.

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)

Update function goes like this ...

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

I add widgets to the sizer later on when the user clicks a button ... I've tried auto layout, FitInside(), Update() ... can't seem to scroll this stepPanel when I add widgets.

EDIT: Adding more info ...

The idea here is that the self.panel has an area at the top that does not scroll (just another panel), while the lower portion scrolls (self.stepPanel), but it appears that the stepPanel grows off of the viewable area of the self.panel

EDIT: Solved see comment.


回答1:


I think I figured it out. As usual, when adding or deleting widgets, you need to call Layout on the parent, which in this case is the scrolled panel that is getting new children. You also have to call SetupScrolling() so it can recalculate how much space there is and whether or not it needs scrollbars. Here's an example that works for me on 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()


来源:https://stackoverflow.com/questions/7795726/scrolledpanel-inside-panel-not-sizing

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!