2011-12-30 6 views
0

주 창에서 이미 Show()를 호출했는지 여부에 따라 wx.Panel을 만들 때 매우 다른 동작이 발생합니다.wxPython 기존 창에 패널 : 느리고 작은

아래와 같은 코드를 사용하면 이라는 메인 패널이 MainFrame.Show() 앞에 채워진 상태로 애플리케이션이 빠르게 열립니다. "새로 만들기"를 사용하면 다시 작성하는 데 수백 초의 시간이 걸리고 200 개의 텍스트는 다시 작성됩니다. 또한 MainPanel은 창 크기가 조정될 때까지 창의 전체 크기를 차지하도록 확장되지 않습니다.

이것은 패널 파괴가 아닌 패널 생성의 문제입니다. MainFrame의 init에서 MainPanel 생성을 제거하면 새로운 작업의 속도는 동일하게 & 크기가됩니다.

두 질문 :

내가 MainFrame.Show() 후 패널 생성 속도를 높이기 위해 할 수있는 일이 있나요?

MainPanel을 부모 크기로 확장하려면 MainFrame.Show() 후에 MainPanel을 만들 때 수행해야 할 작업은 무엇입니까?

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

import wx 
import wx.lib.scrolledpanel 

class MainPanel(wx.lib.scrolledpanel.ScrolledPanel): 
    def __init__(self,parent): 
     wx.lib.scrolledpanel.ScrolledPanel.__init__(self, parent=parent) 
     self.SetupScrolling() 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     for i in range(1,200): 
      sizer.Add(wx.StaticText(self, wx.ID_ANY, "I'm static text")) 
     self.SetSizer(sizer) 
     self.SetAutoLayout(True) 

class MainFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, title="FrameTest", size=(600,800)) 
     self.InitMenu() 
     self.panel = None 
     self.panel = MainPanel(self) 

    def InitMenu(self): 
     self.menuBar = wx.MenuBar() 
     menuFile = wx.Menu() 
     menuFile.Append(wx.ID_NEW, "&New") 
     self.Bind(wx.EVT_MENU, self.OnNew, id=wx.ID_NEW) 
     self.menuBar.Append(menuFile, "&File") 
     self.SetMenuBar(self.menuBar) 

    def OnNew(self, evt): 
     if self.panel: 
      self.panel.Destroy() 
     self.panel = MainPanel(self) 

if __name__ == "__main__": 
    app = wx.App(0) 
    frame = MainFrame() 
    frame.Show() 
    app.MainLoop() 

UPDATE : 호아킨의 SendSizeEvent()는 확실히 첫 번째 문제를 해결한다. 두 번째로, 숨겨진 컨테이너가 잘 작동한다는 것을 발견했습니다. 나는 창을 보여준 후에 모든 새로운 위젯을 불필요하게 다시 표시하려고 시도하고 있는데, 그렇게하면 느려질 것입니다. 패널의 init에 Hide & Show를 추가하면 더 이상 지연이 발생하지 않으며 두 상황에서 모두 작동합니다.

class MainPanel(wx.lib.scrolledpanel.ScrolledPanel): 
    def __init__(self,parent): 
     wx.lib.scrolledpanel.ScrolledPanel.__init__(self, parent=parent) 
     self.SetupScrolling() 
     self.Hide() 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     for i in range(1,200): 
      sizer.Add(wx.StaticText(self, wx.ID_ANY, "I'm static text")) 
     self.SetSizer(sizer) 
     self.SetAutoLayout(True) 
     self.Show() 

답변

1

프레임에 SizeEvent가 표시되면 패널의 크기가 올바르게 설정됩니다. 따라서 두 번째 질문에 적합합니다.

def OnNew(self, evt): 
    if self.panel: 
     self.panel.Destroy() 
    self.panel = MainPanel(self) 
    self.SendSizeEvent() 

sizer를 사용하면 Windows 및 위젯을 쉽게 제어 할 수 있습니다. 메인 프레임에 sizer를 사용하면 위젯을 제자리에 끼우기 위해 사이 저 Layout 방법을 사용할 수 있습니다.

패널 재 작성 속도를 높일 수 없습니다.

class MainPanel(wx.lib.scrolledpanel.ScrolledPanel): 
    def __init__(self,parent): 
     wx.lib.scrolledpanel.ScrolledPanel.__init__(self, parent=parent) 
     self.SetupScrolling() 
     self.sizer = wx.BoxSizer(wx.VERTICAL) 
     self.fill() 
     self.SetSizer(self.sizer) 

    def fill(self): 
     tup = [wx.StaticText(self, wx.ID_ANY, "I'm static text") for i in range(200)] 
     self.sizer.AddMany(tup) 
     self.Layout() 

class MainFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, title="FrameTest", size=(600,800)) 
     self.InitMenu() 
     self.panel = None 
     self.panel = MainPanel(self) 

    def InitMenu(self): 
     self.menuBar = wx.MenuBar() 
     menuFile = wx.Menu() 
     menuFile.Append(wx.ID_NEW, "&New") 
     self.Bind(wx.EVT_MENU, self.OnNew, id=wx.ID_NEW) 
     self.menuBar.Append(menuFile, "&File") 
     self.SetMenuBar(self.menuBar) 

    def OnNew(self, evt): 
     if self.panel: 
      self.panel.sizer.Clear() 
     self.panel.fill() 
+0

SendSizeEvent()를 확실히 첫 번째 문제를 해결 :하지만 당신은 패널을 삭제하는 대신 선별기를 삭제하지 않음으로써 기괴한 시각적 효과를 감소 할 수 있습니다 (이 경우에 SendSizeEvent()을 필요 없어요). –

+0

삭제하는 것이 아니라 sizer를 지우는 것은 흥미로운 일이지만 실제 시나리오에서는 도움이되지 않습니다. 사용자가 파일을 열 때 패널이 비어있는 창을 만들었으므로 삭제하지 않을 이전 패널이 없습니다. 내가 Hide() ing 및 Show() 도움을 찾았지만, 질문을 업데이트했습니다. 감사! –

관련 문제