2010-09-03 33 views
1

如何在我需要时刷新下面的代码片段?禁止wxPython GridTableBase刷新?

例如,如果我现在运行它,table.SetValue(0,0,'test')行将立即更新网格。无论如何要改变这种行为,以便我可以对GridTableBase进行任意数量的更改,然后请求刷新?如果是这样,我如何更改下面的代码来获得该功能?

import wx 
import wx.grid 

class TestTable(wx.grid.PyGridTableBase): 
    def __init__(self): 
     wx.grid.PyGridTableBase.__init__(self) 
     self.data = { (1,1) : "Here", (2,2) : "is", (3,3) : "some", (4,4) : "data"} 
     self.odd=wx.grid.GridCellAttr() 
     self.odd.SetBackgroundColour("sky blue") 
     self.odd.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD)) 
     self.even=wx.grid.GridCellAttr() 
     self.even.SetBackgroundColour("sea green") 
     self.even.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD)) 

    def GetNumberRows(self): 
     return 50 

    def GetNumberCols(self): 
     return 50 

    def IsEmptyCell(self, row, col): 
     return self.data.get((row, col)) is not None 

    def GetValue(self, row, col): 
     value = self.data.get((row, col)) 
     if value is not None: 
      return value 
     else: 
      return '' 

    def SetValue(self, row, col, value): 
     self.data[(row,col)] = value 

    def GetAttr(self, row, col, kind): 
     attr = [self.even, self.odd][row % 2] 
     attr.IncRef() 
     return attr 

class TestFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, title="Grid Table", size=(640,480)) 
     grid = wx.grid.Grid(self) 
     table = TestTable() 
     grid.SetTable(table, True) 
     table.SetValue(0,0,'test') 

app = wx.PySimpleApp() 
frame = TestFrame() 
frame.Show() 
app.MainLoop() 

回答

0

有这种情况的BeginBatchEndBatch网格方法,但他们没有缝定制网表工作。

您可以尝试延迟grid.SetTable调用,直到填充数据。对于连续批次,您可以克隆当前网格表,对克隆进行必要的修改并将克隆设置为当前网格表。

如果您尝试此操作,您可能希望自己管理这些网格表,因此不要像您在示例中那样使网格获得它们的所有权(SetTable调用中的True参数)。