现有窗口中的wxPython面板:缓慢且小
我在创建wx.Panel时遇到了非常不同的行为,这取决于主窗口是否已调用Show() 使用以下代码,应用程序将快速打开,并在现有窗口中的wxPython面板:缓慢且小,python,wxpython,Python,Wxpython,我在创建wx.Panel时遇到了非常不同的行为,这取决于主窗口是否已调用Show() 使用以下代码,应用程序将快速打开,并在MainFrame.Show()之前创建并填充MainPanel。使用“New”重新创建时,会有多秒的延迟,同时会重新生成200个文本。此外,在调整窗口大小之前,主面板不会展开以占据整个窗口大小 这肯定是面板创建的问题,而不是面板销毁的问题;如果我在大型机的init中删除主面板创建,那么新操作具有相同的速度和大小问题 两个问题: 在MainFrame.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,您可以使用sizerLayout
方法将小部件安装到位
找不到加速面板重写的方法。但是,您可以通过不删除面板而是清除大小器来减少奇怪的视觉效果(在这种情况下,您不需要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()