现有窗口中的wxPython面板:缓慢且小

现有窗口中的wxPython面板:缓慢且小,python,wxpython,Python,Wxpython,我在创建wx.Panel时遇到了非常不同的行为,这取决于主窗口是否已调用Show() 使用以下代码,应用程序将快速打开,并在MainFrame.Show()之前创建并填充MainPanel。使用“New”重新创建时,会有多秒的延迟,同时会重新生成200个文本。此外,在调整窗口大小之前,主面板不会展开以占据整个窗口大小 这肯定是面板创建的问题,而不是面板销毁的问题;如果我在大型机的init中删除主面板创建,那么新操作具有相同的速度和大小问题 两个问题: 在MainFrame.Show()之后,我可

我在创建wx.Panel时遇到了非常不同的行为,这取决于主窗口是否已调用Show()

使用以下代码,应用程序将快速打开,并在
MainFrame.Show()之前创建并填充MainPanel。使用“New”重新创建时,会有多秒的延迟,同时会重新生成200个文本。此外,在调整窗口大小之前,主面板不会展开以占据整个窗口大小

这肯定是面板创建的问题,而不是面板销毁的问题;如果我在大型机的init中删除主面板创建,那么新操作具有相同的速度和大小问题

两个问题:

MainFrame.Show()之后,我可以做些什么来加快面板的创建速度吗

MainFrame.Show()
ed之后创建主面板时,需要执行哪些操作才能将主面板扩展到其父面板的大小

#!/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()
更新:joaquin的SendSizeEvent()确实解决了第一个问题。第二,我发现隐藏容器效果很好。我猜在窗口显示之后,它会尝试在每个新的小部件之后不必要地重新(显示/布局/某些东西),这会减慢它的速度。如果我将Hide&Show添加到面板的init中,那么就没有更多的延迟,并且在这两种情况下都可以工作

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()

如果框架感觉有尺寸,面板将获得正确的尺寸。所以这适用于你的第二个问题:

def OnNew(self, evt):
    if self.panel:
        self.panel.Destroy()
    self.panel = MainPanel(self)
    self.SendSizeEvent()
通过使用大小调整器,可以更轻松地控制窗口和小部件。使用主框架中的sizer,您可以使用sizer
Layout
方法将小部件安装到位

找不到加速面板重写的方法。但是,您可以通过不删除面板而是清除大小器来减少奇怪的视觉效果(在这种情况下,您不需要
SendSizeEvent()
):


清除sizer而不是删除sizer是很有趣的,尽管这对我的真实场景没有帮助。我有一个空窗口,当用户打开一个文件时创建一个面板,所以没有以前的面板可以“不删除”。不过,在更新问题时,我发现了隐藏()和显示()帮助。谢谢
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()