グリッドテーブル

Gridテーブルの中で、値を選択したり、チェックを付けたり、値を入力したりと、いろいろなことを一度にやるためにこれまで使ったことがないgridのクラスを試してみる。

挙動が不明な点がいくつかあるので、詳しくソースを見ることに。

import  wx
import  wx.grid as gridlib

class CustomDataTable(gridlib.PyGridTableBase):
    def __init__(self):
        gridlib.PyGridTableBase.__init__(self)

        self.colLabels = ['#', 'Surface name', 'Kind',
                          'X', 'Value']

        self.dataTypes = [gridlib.GRID_VALUE_NUMBER,
                          gridlib.GRID_VALUE_STRING,
                          gridlib.GRID_VALUE_CHOICE + ':EAST,WEST,SOUTH,NORTH',
                          gridlib.GRID_VALUE_BOOL,
                          gridlib.GRID_VALUE_FLOAT + ':6,2',
                          ]

        self.data = [
            [1, "foo ", 'MSW', 1, 1.12],
            [2, "wicket", 'other', 0, 1.50],
            [3, "triangle", 'all', 0, 1.56]
            ]

    def GetNumberRows(self):
        return len(self.data) + 1

    def GetNumberCols(self):
        return len(self.data[0])

    def IsEmptyCell(self, row, col):
        try:
            return not self.data[row][col]
        except IndexError:
            return True

    def GetValue(self, row, col):
        try:
            return self.data[row][col]
        except IndexError:
            return ''

    def SetValue(self, row, col, value):
        def innerSetValue(row, col, value):
            try:
                self.data[row][col] = value
            except IndexError:
                pass
#                self.data.append([''] * self.GetNumberCols())
#                innerSetValue(row, col, value)
#                msg = gridlib.GridTableMessage(self,
#                        gridlib.GRIDTABLE_NOTIFY_ROWS_APPENDED, 1)

#                self.GetView().ProcessTableMessage(msg)
        innerSetValue(row, col, value) 

    def GetColLabelValue(self, col):
        return self.colLabels[col]

    def GetTypeName(self, row, col):
        return self.dataTypes[col]

    def CanGetValueAs(self, row, col, typeName):
        colType = self.dataTypes[col].split(':')[0]
        if typeName == colType:
            return True
        else:
            return False

    def CanSetValueAs(self, row, col, typeName):
        return self.CanGetValueAs(row, col, typeName)

class CustTableGrid(gridlib.Grid):
    def __init__(self, parent):
        gridlib.Grid.__init__(self, parent, -1)

        table = CustomDataTable()
        self.SetTable(table, True)

        self.SetRowLabelSize(0)
        self.SetMargins(0,0)
        self.AutoSizeColumns(False)

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

        wx.Frame.__init__(
            self, parent, -1, "Example", size=(640,200)
            )

        p = wx.Panel(self, -1, style=0)
        grid = CustTableGrid(p)
        bs = wx.BoxSizer(wx.VERTICAL)
        bs.Add(grid, 1, wx.GROW|wx.ALL, 5)
        p.SetSizer(bs)

if __name__ == '__main__':
    import sys
    app = wx.PySimpleApp()
    frame = TestFrame(None)
    frame.Show(True)
    app.MainLoop()