views:

38

answers:

1

How can I make the code snippet below refresh when I want?

For example, if I run it as it is now, the table.SetValue(0,0,'test') line will update the grid straight away. Is there anyway to change this behavior so that I can do an arbitrary amount of changes to the GridTableBase, and then ask for a refresh? If so, how can I change the code below to get that functionality?

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

There are the BeginBatch and EndBatch grid methods for this but they don't seam to work with custom grid tables.

You could try delaying the grid.SetTable call until after you populate the data. For consecutive batches you could clone the current grid table, make the necessary modifications on the clone and set the clone as the current grid table.

If you try this you will probably want to manage these grid tables yourself so don't make the grid take ownership of them as you did in your example (the True argument in the SetTable call).

Toni Ruža