2017-11-29 40 views
0

-wx.Tybook 안의 wxPython wx.ScrolledPanel이 자동으로 크기 조정되지 않음

안녕하세요!

필자는 스크롤바가 필요하므로 기본 패널을 ScrolledPanel로 변경했지만 ScrolledPanel에 삽입 한 내용으로는 윈도우 크기에 따라 자동으로 크기가 조정되지 않습니다. 그런 다음 기본 패널을 만들고 BoxSizer를 통해 모든 위젯을 삽입하고 마지막으로 다른 BoxSizer를 통해이 패널을 ScrolledPanel에 삽입하려고 시도했지만 내용은 자동 크기 조정을 수행하지 않고 계속됩니다. 나는 또한 표준 패널을 만들고 BoxSizers를 사용하여 내 ScrolledPanel 내부에 삽입했지만 작동하지도 않는 반대를 시도했습니다. 또 다른 세부 사항은 각 ScrolledPanel의 호출을 관리하는 트리가 있으므로이 ScrolledPanels가 TreeBook 안에 있어야한다는 것입니다. 나는 잘못하고 있다고 생각하지만, 그것이 무엇인지, 어떻게하는지 모른다.

내 코드 :

import wx 
import wx.lib.scrolledpanel as scrolled 

from gettext import gettext as _ 

class MyMainView(wx.Frame): 

    instance = None 
    init = 0 

    def __init__(self, app): 
     if self.init: 
      return 

     self.frameWidth = 850 
     self.frameHeight = 600 
     self.init = 1 

     no_sys_menu = wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.CAPTION | wx.CLIP_CHILDREN | wx.CLOSE_BOX 
     wx.Frame.__init__(self, None, title=_("Title"), style=no_sys_menu) 
     self.SetSize(wx.Size(self.frameWidth, self.frameHeight)) 

     self.SetBackgroundColour('white') 
     self.Centre() 

     treeBook = Treebook(self) 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(treeBook, 1, wx.ALL | wx.EXPAND, 10) 

     self.SetSizer(sizer) 
     self.Show() 
     self.Layout() 

    def __new__(self, *args, **kwargs): 
     if self.instance is None: 
      self.instance = wx.Frame.__new__(self) 
     elif not self.instance: 
      self.instance = wx.Frame.__new__(self) 

     return self.instance 


class Treebook(wx.Treebook): 

    def __init__(self, parent): 
     wx.Treebook.__init__(self, parent, wx.ID_ANY, style=wx.BK_DEFAULT) 

     self.AddPage(MainPanel(self), _("AppTitle")) 
     self.AddSubPage(MenuPanel(self), _("SubNodeTitle1")) 
     self.ExpandNode(0) 


class MainPanel(wx.Panel): # This Panel is OK 

    def __init__(self, parent): 
     wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY) 

     self.font1 = wx.Font(18, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD) 
     self.font2 = wx.Font(10, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL) 

     self.SetBackgroundColour("white") 

     pngIcon = wx.Image("foo.ico", wx.BITMAP_TYPE_ANY).ConvertToBitmap() 
     icon = wx.StaticBitmap(self, -1, pngIcon, pos=(25, 15), size=(pngIcon.GetWidth(), pngIcon.GetHeight())) 

     titleHelp = wx.StaticText(self, -1, _("HelpTitle")) 
     titleHelp.SetFont(self.font1) 

     titleApp = wx.StaticText(self, -1, _("AppTitle"), pos=(25, 85)) 
     titleApp.SetFont(self.font1) 

     description = wx.StaticText(self, -1, _("App description."), pos=(25, 170)) 
     description.SetFont(self.font2) 

     features = wx.StaticText(self, -1, _("App features."), pos=(25, 210)) 
     features.SetFont(self.font2) 

     pngLogo = wx.Image("foo.png", wx.BITMAP_TYPE_ANY).ConvertToBitmap() 
     logo = wx.StaticBitmap(self, -1, pngLogo, pos=(25, 390), size=(pngLogo.GetWidth(), pngLogo.GetHeight())) 

     sliLine = wx.StaticLine(self, -1, style=wx.LI_HORIZONTAL) 
     sliLine.SetSize(wx.Size(625, 1)) 

     steCopy = wx.StaticText(self, -1, _("Copyright text.")) 
     steCopy.SetFont(self.font2) 

     heigthSpacer = 20 

     hSizer = wx.BoxSizer(wx.HORIZONTAL) 
     hSizer.Add(icon, 0, wx.LEFT, 0) 
     hSizer.Add(titleHelp, 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 10) 

     vSizer = wx.BoxSizer(wx.VERTICAL) 
     vSizer.AddSpacer(heigthSpacer) 
     vSizer.Add(hSizer, 0, wx.LEFT, 10) 
     vSizer.AddSpacer(heigthSpacer + 10) 
     vSizer.Add(titleApp, 0, wx.LEFT, 15) 
     vSizer.AddSpacer(10) 
     vSizer.Add(description, 0, wx.LEFT, 15) 
     vSizer.AddSpacer(heigthSpacer) 
     vSizer.Add(features, 0, wx.LEFT, 15) 
     vSizer.AddSpacer(115) 
     vSizer.Add(logo, 0, wx.LEFT, 15) 
     vSizer.Add(sliLine, 0, wx.TOP | wx.LEFT | wx.RIGHT | wx.EXPAND, 15) 
     vSizer.Add(steCopy, 0, wx.LEFT | wx.RIGHT | wx.ALIGN_RIGHT, 15) 

     self.SetSizer(vSizer) 


class MenuPanel(scrolled.ScrolledPanel): # This panel does not fit content within the size of the Treebook panel 

    def __init__(self, parent): 
     scrolled.ScrolledPanel.__init__(self, parent, -1) 
     self.SetBackgroundColour("white") 

     self.font1 = wx.Font(18, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD) 
     self.font2 = wx.Font(10, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL) 
     self.font3 = wx.Font(12, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD) 

     strTitlePage = wx.StaticText(self, -1, _("TitlePanel")) 
     strTitlePage.SetFont(self.font1) 

     strIntroPage = wx.StaticText(self, -1, _("Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.")) 
     strIntroPage.SetFont(self.font2) 

     png = wx.Image("foo.png", wx.BITMAP_TYPE_ANY).ConvertToBitmap() 
     bitmap1 = wx.StaticBitmap(self, -1, png, pos=(240, 100), size=(png.GetWidth(), png.GetHeight())) 

     steMainTitle = wx.StaticText(self, -1, _("MainMenu")) 
     steMainTitle.SetFont(self.font3) 

     steMainMenu = wx.StaticText(self, -1, _("Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.")) 
     steMainMenu.SetFont(self.font2) 

     png = wx.Image("foo.png", wx.BITMAP_TYPE_ANY).ConvertToBitmap() 
     bitmap2 = wx.StaticBitmap(self, -1, png, pos=(240, 100), size=(png.GetWidth(), png.GetHeight())) 

     steLangTitle = wx.StaticText(self, -1, _("Config Menu")) 
     steLangTitle.SetFont(self.font3) 

     steLangMenu = wx.StaticText(self, -1, _("Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.")) 
     steLangMenu.SetFont(self.font2) 

     png = wx.Image("foo.png", wx.BITMAP_TYPE_ANY).ConvertToBitmap() 
     bitmap3 = wx.StaticBitmap(self, -1, png, pos=(240, 100), size=(png.GetWidth(), png.GetHeight())) 

     stePortMenu = wx.StaticText(self, -1, _("Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.")) 
     stePortMenu.SetFont(self.font2) 

     png = wx.Image("foo.png", wx.BITMAP_TYPE_ANY).ConvertToBitmap() 
     bitmap4 = wx.StaticBitmap(self, -1, png, pos=(240, 100), size=(png.GetWidth(), png.GetHeight())) 

     steHelpTitle = wx.StaticText(self, -1, _("Menu Help")) 
     steHelpTitle.SetFont(self.font3) 

     steHelpMenu = wx.StaticText(self, -1, _("Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.")) 
     steHelpMenu.SetFont(self.font2) 

     sliLine = wx.StaticLine(self, -1, style=wx.LI_HORIZONTAL) 

     steCopy = wx.StaticText(self, -1, _("Copyright text.")) 
     steCopy.SetFont(self.font2) 

     heigthSpacer = 20 

     vSizer = wx.BoxSizer(wx.VERTICAL) 
     vSizer.AddSpacer(heigthSpacer) 
     vSizer.Add(strTitlePage, 0, wx.ALL, 5) 
     vSizer.Add(strIntroPage, 0, wx.EXPAND, 5) 
     vSizer.AddSpacer(heigthSpacer) 
     vSizer.Add(steMainTitle, 0, wx.ALL, 5) 
     vSizer.Add(bitmap1, 0, wx.ALIGN_CENTRE_HORIZONTAL, 5) 
     vSizer.Add(steMainMenu, 0, wx.EXPAND, 5) 
     vSizer.AddSpacer(heigthSpacer) 
     vSizer.Add(steLangTitle, 0, wx.ALL, 5) 
     vSizer.Add(bitmap2, 0, wx.ALIGN_CENTRE_HORIZONTAL, 5) 
     vSizer.Add(steLangMenu, 0, wx.EXPAND, 5) 
     vSizer.AddSpacer(heigthSpacer) 
     vSizer.Add(bitmap3, 0, wx.ALIGN_CENTRE_HORIZONTAL, 5) 
     vSizer.Add(stePortMenu, 0, wx.EXPAND, 5) 
     vSizer.AddSpacer(heigthSpacer) 
     vSizer.Add(steHelpTitle, 0, wx.ALL, 5) 
     vSizer.Add(bitmap4, 0, wx.ALIGN_CENTRE_HORIZONTAL, 5) 
     vSizer.Add(steHelpMenu, 0, wx.EXPAND, 5) 
     vSizer.AddSpacer(heigthSpacer) 
     vSizer.Add(sliLine, 0, wx.ALL | wx.EXPAND, 5) 
     vSizer.Add(steCopy, 0, wx.ALIGN_RIGHT, 5) 

     self.SetSizer(vSizer) 
     self.Layout() 
     self.SetAutoLayout(1) 
     self.SetupScrolling() 

def main(): 
    app = wx.App(False) 
    main = MyMainView(app) 
    app.MainLoop() 

if __name__ == '__main__': 
    main() 

내가 원하는 것은 트리에서 항목을 클릭하고 내 창 (statictexts, staticlines)의 크기에 따라 크기가 조정되는 내용으로 패널 옆에 열 수 있습니다.

잘 설명 할 수 있을지 모르겠으니 궁금한 점이 있습니다.

모두에게 도움과 관심을 가져 주셔서 감사합니다.

+0

코드 샘플을 붙여넣고 실행할 수 있다면 ... –

+0

내 오류 @PetrBlahos를 용서하십시오. 코드를 조정했는데 이제는 기능적입니다. 도와 줘서 고마워! – msribeir

답변

1

내가 제대로 이해한다면 모르겠지만 :

  • 의 StaticText 자동으로 줄 바꿈하지 않을 것이다, 그래서 "내부 패널이"제대로 크기를 조정할 경우에도 텍스트가 표시되지 않을 것입니다. 어떤 종류의 TextCtrl을 사용하고자 할 수 있습니다. 아마도 rich-text ctrl 일 수 있습니다.
  • 스크롤 한 패널이있는 경우 패널 내부에는 필요한 크기가 있으며 스크롤 된 패널에는 스크롤 막대 만 추가됩니다.

그래서 필요한 것은 다음과 같습니다. MenuPanel 안에 다른 패널을 만들고이 새 패널의 MenuPanel 하위에 모든 위젯을 만듭니다. 그런 다음 MenuPanel에 on-size 핸들러를 추가하십시오.

self.Bind(wx.EVT_SIZE, self.OnSize) 

def OnSize(self, evt): 
    evt.Skip(False) 
    self.p.SetSize(evt.GetSize()) 

(self.p는 MenuPanel의 새 패널 임). 그러나 이렇게하면 패널의 크기가 설정되므로 스크롤 막대가 필요하지 않습니다. 아마 필요할 때만 수직 스크롤 바를 원할 것입니다, 그렇죠? 그렇다면 가능한 경우에만 창의 너비를 설정하거나 너비와 매우 큰 높이를 설정하고 크기를 다시 설정하려고합니다.