【发布时间】:2011-12-30 00:38:05
【问题描述】:
我在创建 wx.Panel 时遇到了非常不同的行为,具体取决于主窗口是否已调用 Show()。
使用下面的代码,应用程序可以快速打开,并在 MainFrame.Show() 之前创建并填充 MainPanel。使用“新建”来重新创建它在重新制作 200 条文本时有几秒钟的延迟。此外,在调整窗口大小之前,MainPanel 不会展开以占据窗口的整个大小。
这绝对是面板创建而不是面板破坏的问题;如果我在 MainFrame 的 init 中删除 MainPanel 创建,则 New 操作具有相同的速度和大小问题。
两个问题:
在MainFrame.Show() 之后,我可以做些什么来加快面板创建速度?
在MainFrame.Show()ed 之后创建 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()
更新: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()
【问题讨论】: