2011-10-17 7 views
1

나는 잠시 동안 이걸 가지고 놀았으나 알아낼 수 없었다. self.panel = wx.Panel (self, wx.ID_ANY)패널 내부의 스크롤 패널

스크롤하지 않는 패널 안에는 스크롤 된 패널이 있습니다. 기능은 다음과 같이 간다

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() ... 위젯을 추가 할 때이 stepPanel을 스크롤 할 수 없습니다.

편집 : 추가 추가 정보를 원하시면 ...

여기에서의 아이디어 self.panel이, 아래 부분의 스크롤 동안 (self.stepPanel를 스크롤하지 않습니다 상단 (또 다른 패널)의 영역을 가지고 있다는 것입니다), stepPanel이 self.panel의 가시 영역에서 자란 것으로 보입니다.

편집 : 해설 참조.

+0

해결 : SizerAndFit이 문제 였고, Fit을 제거하고 모든 것이 훌륭하게 작동합니다. – lostdev

답변

2

나는 그것을 이해했다고 생각합니다. 평상시와 마찬가지로 위젯을 추가하거나 삭제할 때 부모의 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() 
+0

위젯을 추가 한 후에'SetupScrolling'을 다시 호출해야한다고 생각한 적이 없었습니다! (내 경험은 Windows와 MacOS에서의 경험과 같았지만 Linux에서는 추가 단계가 없이는 저에게 효과적이었습니다) – starfry

+0

예. GUI 작업은 전형적으로 당신이 원하는 방식대로 작동하도록 약간의 시행 착오가되고 만다. –