2009-07-29 20 views
2

看來,這是特定於Windows,這裏是再現效果的例子:使用Python 2.5.4和爲什麼wxGridSizer在wxDialog上然後在wxFrame上初始化要慢得多?

  • 的Windows 7:

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

    我已經嘗試了本上進行如下配置wxPython的2.8.10.1

  • Windows XP中使用Python 2.5.2和wxPython的2.8.7.1
  • Windows XP中使用Python 2.6.0和wxPython的2.8.9.1
  • ü buntu 9.04與Python 2.6.2和wxPython 2.8.9.1

只有在Ubuntu上,wxDialog速度並不慢。

回答

2

我收到了關於wxPython-users mailing list的回覆,可以通過在顯示對話框之前明確呼叫Layout來解決問題。

這真是奇怪......

我的猜測是,這是由於 Windows和wxWidgets的不重疊的兄弟姐妹非常處理好 ,所以 當篩分器做初始 佈局並將所有面板從 (0,0)移動到他們需要的位置 對話框的某些內容導致 全部刷新,並且 在每次移動時重新繪製。如果你 改爲在 之前做初始佈局,那麼顯示的對話框就像框架一樣快,如 。

您可以通過在 makegrid的末尾添加對window.Layout()的調用來完成此操作。

- Robin Dunn

相關問題