【问题标题】:wxPython Panel in existing window: slow and small现有窗口中的 wxPython 面板:慢且小
【发布时间】: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()

【问题讨论】:

    标签: python wxpython


    【解决方案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()
    

    【讨论】:

    • 清除sizer而不是删除很有趣,尽管它对我的现实生活没有帮助。我有一个空窗口并在用户打开文件时创建一个面板,因此没有前一个面板可以“不删除”。不过,当我更新了问题时,我发现 Hide()ing 和 Show()ing 有所帮助。谢谢!
    猜你喜欢
    • 2012-01-07
    • 2021-04-03
    • 2011-08-25
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    相关资源
    最近更新 更多