为什么wxGridSizer在wxDialog上然后在wxFrame上初始化要慢得多?

时间:2009-07-29 04:36:47

标签: python windows wxpython

这似乎是特定于windows,这是一个再现效果的例子:

import wx


def makegrid(window):
    grid = wx.GridSizer(24, 10, 1, 1)
    window.SetSizer(grid)
    for i in xrange(240):
        cell = wx.Panel(window)
        cell.SetBackgroundColour(wx.Color(i, i, i))
        grid.Add(cell, flag=wx.EXPAND)


class TestFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent)
        makegrid(self)


class TestDialog(wx.Dialog):
    def __init__(self, parent):
        wx.Dialog.__init__(self, parent)
        makegrid(self)


class Test(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None)
        btn1 = wx.Button(self, label="Show Frame")
        btn2 = wx.Button(self, label="Show Dialog")
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(sizer)
        sizer.Add(btn1, flag=wx.EXPAND)
        sizer.Add(btn2, flag=wx.EXPAND)
        btn1.Bind(wx.EVT_BUTTON, self.OnShowFrame)
        btn2.Bind(wx.EVT_BUTTON, self.OnShowDialog)

    def OnShowFrame(self, event):
        TestFrame(self).Show()

    def OnShowDialog(self, event):
        TestDialog(self).ShowModal()


app = wx.PySimpleApp()
app.TopWindow = Test()
app.TopWindow.Show()
app.MainLoop()

我在以下配置中试过这个:

  • Windows 7 with Python 2.5.4和wxPython 2.8.10.1
  • Windows XP with Python 2.5.2和wxPython 2.8.7.1
  • Windows XP with Python 2.6.0和wxPython 2.8.9.1
  • Ubuntu 9.04 with Python 2.6.2 and wxPython 2.8.9.1

wxDialog在Ubuntu上并不慢。

1 个答案:

答案 0 :(得分:2)

我收到wxPython-users mailing list的回复,可以通过在显示对话框之前显式调用Layout来解决问题。

  

这真的很奇怪......

     

我的猜测是,这是由于   Windows和wxWidgets处理不当   与兄弟姐妹重叠,等等   当sizer正在进行初始化时   布局和移动所有面板   (0,0)他们需要的地方   关于对话框的一些事情正在引起   所有这些都要精神焕发   每次搬家都重新粉刷。如果你   而是先做初始布局   显示对话框然后它就像   快于框架。

     

您可以通过添加对window.Layout()的调用来完成此操作   makegrid。

     

- 罗宾邓恩