示例#1
0
class Grid(wx.grid.Grid):
    def __init__(self, parent):
        wx.grid.Grid.__init__(self, parent, -1)
        self.tablebase = TableBase()
        self.Bind(wx.grid.EVT_GRID_RANGE_SELECT, self.on_select)
        self.table = Table()
        self.Bind(wx.grid.EVT_GRID_LABEL_RIGHT_CLICK, self.on_label)

    def on_label(self, evt):
        row, col = evt.GetRow(), evt.GetCol()
        if row==-1:
            props = self.table.props
            
            cur = props[self.table.columns[col]]
            print(cur)
            para = {'accu':cur[0], 'tc':cur[1], 'lc':cur[2], 'ln':cur[3]}
            view = [(int, 'accu', (0, 10), 0, 'accuracy', ''),
                    ('color', 'tc', 'text color', ''),
                    ('color', 'lc', 'line color', ''),
                    (list, 'ln', ['Text', 'Line', 'Both'], str, 'draw', '')]
            rst = get_para(para, view, 'Table Properties', self)
            if not rst :return
            print(para)
            if col!=-1:
                props[self.table.columns[col]] = [para[i] for i in ['accu', 'tc', 'lc', 'ln']]
                print(props[self.table.columns[col]])
                print('===========')
            if col==-1:
                for c in self.table.columns:
                    props[c] = [para[i] for i in ['accu', 'tc', 'lc', 'ln']]
        self.update()

    def set_data(self, tab):
        if isinstance(tab, Table):
            self.table = tab
        else: self.table.data = tab
        self.tablebase.set_data(self.table)
        self._rows, self._cols = tab.shape
        self.SetTable(self.tablebase)
        self.update()

    def set_style(self, name, **key):
        self.table.set_style(name, **key)
        self.update()

    def on_select(self, event):
        rs, cs = self.GetSelectedRows(), self.GetSelectedCols()
        lt, rb = self.GetSelectionBlockTopLeft(), self.GetSelectionBlockBottomRight()
        if len(lt)==1 and len(rb)==1: 
            return self.table.select(range(lt[0][0],rb[0][0]+1), range(lt[0][1],rb[0][1]+1))
        else: self.table.select(list(rs), list(cs), True)

    def update(self):
        self.tablebase.ResetView(self)

    def select(self):
        self.Bind(wx.grid.EVT_GRID_RANGE_SELECT, None)
        self.ClearSelection()
        for i in self.table.index.get_indexer(self.table.rowmsk):
            self.SelectRow(i, True)
        for i in self.table.columns.get_indexer(self.table.colmsk):
            self.SelectCol(i, True)
        self.Bind(Grid.EVT_GRID_RANGE_SELECT, self.on_select)

    def __del__(self):
        print('grid deleted!!!')
示例#2
0
class Grid(wx.grid.Grid):
    def __init__(self, parent):
        wx.grid.Grid.__init__(self, parent, -1)
        self.tablebase = TableBase()
        self.table = Table()
        self.tool = None

        self.Bind(wx.grid.EVT_GRID_RANGE_SELECT, self.on_select)
        self.Bind(wx.grid.EVT_GRID_LABEL_RIGHT_CLICK, self.on_label)
        self.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.on_cell)
        self.Bind(wx.grid.EVT_GRID_LABEL_LEFT_CLICK, self.on_cell)
        self.Bind(wx.EVT_IDLE, self.on_idle)

    def on_label(self, evt):
        row, col = evt.GetRow(), evt.GetCol()
        if row == -1:
            props = self.table.props

            cur = props[self.table.columns[col]]
            print(cur)
            para = {'accu': cur[0], 'tc': cur[1], 'lc': cur[2], 'ln': cur[3]}
            view = [(int, 'accu', (0, 10), 0, 'accuracy', ''),
                    ('color', 'tc', 'text color', ''),
                    ('color', 'lc', 'line color', ''),
                    (list, 'ln', ['Text', 'Line', 'Both'], str, 'draw', '')]
            rst = get_para(para, view, 'Table Properties', self)
            if not rst: return
            print(para)
            if col != -1:
                props[self.table.columns[col]] = [
                    para[i] for i in ['accu', 'tc', 'lc', 'ln']
                ]
                print(props[self.table.columns[col]])
                print('===========')
            if col == -1:
                for c in self.table.columns:
                    props[c] = [para[i] for i in ['accu', 'tc', 'lc', 'ln']]
        self.update()

    def on_cell(self, me):
        x, y = me.GetCol(), me.GetRow()
        obj, tol = self.table, TableTool.default
        tool = self.tool or tol
        #ld, rd, md = me.LeftIsDown(), me.RightIsDown(), me.MiddleIsDown()
        sta = [me.AltDown(), me.ControlDown(), me.ShiftDown()]
        others = {'alt': sta[0], 'ctrl': sta[1], 'shift': sta[2], 'grid': self}
        tool.mouse_down(self.table, x, y, 0, **others)
        me.Skip()

    def set_data(self, tab):
        if isinstance(tab, Table):
            self.table = tab
        else:
            self.table.data = tab
        self.tablebase.set_data(self.table)
        self._rows, self._cols = tab.shape
        self.SetTable(self.tablebase)
        self.update()

    def set_style(self, name, **key):
        self.table.set_style(name, **key)
        self.update()

    def on_select(self, event):
        rs, cs = self.GetSelectedRows(), self.GetSelectedCols()
        lt, rb = self.GetSelectionBlockTopLeft(
        ), self.GetSelectionBlockBottomRight()
        if len(lt) == 1 and len(rb) == 1:
            return self.table.select(range(lt[0][0], rb[0][0] + 1),
                                     range(lt[0][1], rb[0][1] + 1))
        else:
            self.table.select(list(rs), list(cs), True)

    def update(self):
        self.tablebase.ResetView(self)

    def select(self):
        self.Bind(wx.grid.EVT_GRID_RANGE_SELECT, None)
        self.ClearSelection()
        for i in self.table.index.get_indexer(self.table.rowmsk):
            self.SelectRow(i, True)
        for i in self.table.columns.get_indexer(self.table.colmsk):
            self.SelectCol(i, True)
        self.Bind(wx.grid.EVT_GRID_RANGE_SELECT, self.on_select)

    def on_idle(self, event):
        if not self.IsShown() or self.table is None\
            or self.table.dirty == False:
            return
        self.select()
        self.tablebase.ResetView(self)
        self.table.dirty = False
        print('update')

    def __del__(self):
        print('grid deleted!!!')