2012-07-17 2 views
0

같은 크기로 유지되는 세로 패널 패널 집합을 가질 수 있지만 창에서 스크롤 할 수있는 세로 스크롤 막대가 있어야합니다. 지금 나는 wx.ScrolledPanel를 사용하고에 패널을 추가하고 사이 저에 이르렀지만 아무것도 정말 화면wxpython에서 여러 패널을 스크롤하는 데 문제가 있습니다.

import wx 
import wx.lib.scrolledpanel as scrolled 
class josh(wx.Frame): 
def __init__(self, parent, id): 
    wx.Frame.__init__(self, wx.GetApp().TopWindow, title='Title',size=(800,600)) 
    arr= ['Q1.......','Q2.......','Q3.......','Q4.......','Q5.......','Q6.......','Q7..............','Q8..........'] 
    scroll=scrolled.ScrolledPanel(self, -1) 
    #scroll.SetScrollbars(1,1,1,1) 
    panelList = [] 
    commentList = [] 
    count = 1 
    sizer = wx.BoxSizer(wx.VERTICAL) 

    for p in arr: 
     panelList.append(wx.Panel(scroll ,-1, size = (800,100), style=wx.SUNKEN_BORDER)) 
     sizer.Add(panelList[count-1], 1, wx.EXPAND) 
     wx.StaticText(panelList[count-1], -1, str(count), (5, 50), wx.DefaultSize) 
     commentList.append(wx.TextCtrl(panelList[count-1], style=wx.TE_MULTILINE,pos=(500, 20),size = (200,50))) 
     count+=1 



    self.SetAutoLayout(True) 
    self.SetSizer(sizer) 
    scroll.SetupScrolling() 
if __name__=='__main__': 
app=wx.App(False) 
frame=josh(parent=None,id=-1) 
frame.Show() 
app.MainLoop() 

답변

0

에 최대 보여줍니다있어 당신은 스크롤 위젯 자식 위젯 각 패널이있다. 그러나 각 패널을 sizer에 추가 한 다음 실수로 프레임 sizer를 "sizer"라는 sizer로 설정합니다.

이것은 거의 항상 시각적 인 효과가 떨어지는 불일치입니다.

scrolled.SetSizer (sizer) 을 설정하거나 새로운 크기 조절기를 만들거나, framesizer라고 부른 다음 스크롤하여 추가하십시오. 그 다음 self.SetSizer (framesizer) self (josh() 프레임 인 경우).

또한 위젯이 ScrolledPanel보다 크지 않으면 ScrolledPanel에 스크롤 막대가 표시되지 않습니다.

# Broken down here to show sizer child-parent hiearchy 
# AND widget child-parent hiearchy need to be congruent 

import wx 
import wx.lib.scrolledpanel 
scrolled = wx.lib.scrolledpanel #i use reload(...) in pyslices.py 


class Panel(wx.Panel): 
    def __init__(self, parent, color='black'): 
     wx.Panel.__init__(self, parent, size=(800,100)) 

     # several "Panels" sized added together 
     # are bigger than ScrolledPanel size 

     self.SetMinSize((800, 100)) 
     self.SetBackgroundColour(color) 

     widget1 = wx.TextCtrl(self, style=wx.TE_MULTILINE) 
     widget2 = wx.TextCtrl(self, style=wx.TE_MULTILINE) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(widget1, 1, wx.ALL | wx.EXPAND, 15) 
     sizer.Add(widget2, 1, wx.ALL | wx.EXPAND, 15) 

     self.SetSizer(sizer) 


class BigPanel(wx.Panel): 
    def __init__(self, parent): 

     # at least one child widget or aggregate width 
     # of several child widgets has to be wider than 
     # ScrolledPanel to show its horizontal scroll bar 

     # at least one child widget or aggregate height 
     # of more then one child widget has to be "taller" than 
     # the height of the ScrolledPanel for it to show 
     # its vertical scroll bar 

     # -------------------------------------V---V 
     wx.Panel.__init__(self, parent, size=(800,800)) 
     # -------------------------------------^---^ 

     panel0 = Panel(self, 'black') 
     panel1 = Panel(self, 'red') 
     panel2 = Panel(self, 'green') 
     panel3 = Panel(self, 'blue') 
     panel4 = Panel(self, 'white') 
     panel5 = Panel(self, 'purple') 

     sizer = wx.BoxSizer(wx.VERTICAL) 

     sizer.Add(panel0, 1, wx.ALL | wx.EXPAND, 15) 
     sizer.Add(panel1, 1, wx.ALL | wx.EXPAND, 15) 
     sizer.Add(panel2, 1, wx.ALL | wx.EXPAND, 15) 
     sizer.Add(panel3, 1, wx.ALL | wx.EXPAND, 15) 
     sizer.Add(panel4, 1, wx.ALL | wx.EXPAND, 15) 
     sizer.Add(panel5, 1, wx.ALL | wx.EXPAND, 15) 

     self.SetSizer(sizer) 


class ScrolledPanel(scrolled.ScrolledPanel): 
    def __init__(self, parent): 
     # ---------------------------------------------------V---V 
     scrolled.ScrolledPanel.__init__(self, parent, size=(400,400)) 
     # ---------------------------------------------------^---^ 

     bigpanel = BigPanel(self) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(bigpanel, 1, wx.ALL | wx.EXPAND, 15) 

     self.SetSizer(sizer) 
     self.SetAutoLayout(1) 
     self.SetupScrolling() 


class Frame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, parent = wx.GetApp().GetTopWindow(), 
      title = 'Trouble with scrolling through several panels in wxpython', 
      size = (500,400)) 

     scroll = ScrolledPanel(self) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(scroll, 1, wx.ALL | wx.EXPAND, 15) 
     self.SetSizer(sizer) 


if __name__ == '__main__': 
    app = wx.GetApp() 
    if not app: app = wx.App(0) 
    frame = Frame() 
    frame.Show() 
    if not app.IsMainLoopRunning(): 
     app.MainLoop() 
관련 문제