2011-12-30 25 views
0

創建wx.Panel時,根據主窗口是否已調用Show(),我遇到了非常不同的行爲。在現有窗口中的wxPython面板:緩慢和小

用下面的代碼,應用程序快速打開,並創建了之前創建的。使用「新建」重新創建它時會有多秒的滯後,而重新制作200個文本。此外,MainPanel不會展開佔據整個窗口的大小,直到窗口被調整大小。

這確實是面板創建而不是面板銷燬的問題;如果我在MainFrame的init中刪除MainPanel創建,那麼New操作的速度與&的速度相同。

兩個問題:

有什麼我可以做MainFrame.Show()後加快面板創造?

MainFrame.Show()之後創建MainPanel以使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()肯定解決了第一個問題。第二,我發現隱藏容器工作得很好。我猜測,在窗口顯示之後,它試圖在每個新窗口小部件之後不必要地重新(顯示/佈局/某些東西),這會減慢它的速度。如果我將隱藏&顯示添加到面板的初始化,那麼沒有更多的滯後,它在兩種情況下都能正常工作。

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

如果Frame感覺SizeEvent,面板將得到正確的大小。所以這適用於你的第二個問題:

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

使用sizer控制窗口和小部件變得更容易。通過在主框架中使用sizer,您可以使用sizer Layout方法來適應小部件。

無法找到加快面板重寫的方法。但是你可以通過不刪除的面板,但結算篩分器,而不是削弱離奇的視覺效果(你不需要SendSizeEvent()這種情況):

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()肯定解決了第一個問題。 – 2011-12-31 21:46:59

+0

清除sizer而不是刪除是有趣的,雖然它不能幫助我的真實情況。我有一個空的窗口,當用戶打開一個文件時創建一個面板,所以沒有以前的面板「不刪除」。儘管我發現了Hide()ing和Show()幫助,但我更新了這個問題。謝謝! – 2011-12-31 21:54:57