问题
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