wxpython利用table展示表格支持增、删、改、查

首先看一下效果

wxpython中实现表格有两种方式:

(1)一种是根据数据确定的数据的维度CreateGrid(n,n),也就是创建一个n行n列的表格,但这种方式实现新增数据和删除数据比较困难。

(2)创建类继承wx.grid.PyGridTableBase,并覆盖父类的一些方法,通过SetTable方法绑定上面实现的子类和Grid。

第一种方式官网有很多demo可以参考,这里主要讨论一下第二种方式,并实现增删改查。

一、首先创建PyGridTableBase的子类

class StudentInfoGridTable(grid.PyGridTableBase):
    def __init__(self, datas):
        grid.GridTableBase.__init__(self)

        self.datas = datas
        self.colLabels = [u'姓名', u'性别', u'学校', u'专业', u'年级']

这里通过colLabels设置了行头(也可以在类的实例化时传过来),通过self.datas=datas,在实例化时把要显示的数据传递过来。

二、调用

gridDatas = [
            [u'大仲马', u'男', 'SWUST', u'中文', u'研三'],
            [u'牛顿', u'男', u'SHUST', u'物理', u'博一'],
            [u'爱因斯坦', u'男', u'SHUST', u'物理', u'研一'],
            [u'居里夫人', u'女', u'SWUST', u'化学', u'研一'],
        ]
self.gridTable = wx.grid.Grid(self.panel, -1, pos=(5, 5), size=(490, 300), style=wx.WANTS_CHARS)
self.infoTable = StudentInfoGridTable(gridDatas)
self.gridTable.SetTable(self.infoTable, True)

gridDatas是要展示的数据,对前面的StudentInfoGridTable类进行初始化,然后创建Grid,并对Grid进行SetTable()。这样数据就可以展示了。

三、修改数据

扫描二维码关注公众号,回复: 10687330 查看本文章

默认是不能修改数据的,会提示需要重写SetValue方法,在StudentInfoGridTable类中

def SetValue(self, row, col, value):
    print(str(row) + "-" + str(col) + "-" + value)
    try:
        self.datas[row][col] = value
    except IndexError:
        # add a new row
        self.datas.append([''] * self.GetNumberCols())
        innerSetValue(row, col, value)

        # tell the grid we've added a row
        msg = grid.GridTableMessage(self,  # The table
                                    grid.GRIDTABLE_NOTIFY_ROWS_APPENDED,  # what we did to it
                                    1  # how many
                                    )

        self.GetView().ProcessTableMessage(msg)

四、增加数据

def AppendRows(self, newData=None):
    if newData is None:
        newData = [u'居里夫人1', u'女', u'WUST', u'化学', u'研3']
    self.datas.append(newData)
    self.isModified = True
    gridView = self.GetView()
    gridView.BeginBatch()
    appendMsg = wx.grid.GridTableMessage(self, wx.grid.GRIDTABLE_NOTIFY_ROWS_APPENDED, 1)
    gridView.ProcessTableMessage(appendMsg)
    gridView.EndBatch()
    getValueMsg = wx.grid.GridTableMessage(self, wx.grid.GRIDTABLE_REQUEST_VIEW_GET_VALUES)
    gridView.ProcessTableMessage(getValueMsg)

    return True

可以把要添加的数据传递过来,然后在最后一条增加新的数据。当然也可以在指定的行添加数据。

五、删除

def DeleteRows(self, pos=0):
    if self.datas is None or len(self.datas) == 0:
        return False

    self.datas.remove(self.datas[pos + rowNum])

    gridView = self.GetView()
    gridView.BeginBatch()
    deleteMsg = wx.grid.GridTableMessage(self, wx.grid.GRIDTABLE_NOTIFY_ROWS_DELETED, pos, 1)
    gridView.ProcessTableMessage(deleteMsg)
    gridView.EndBatch()
    getValueMsg = wx.grid.GridTableMessage(self, wx.grid.GRIDTABLE_REQUEST_VIEW_GET_VALUES)
    gridView.ProcessTableMessage(getValueMsg)

    return True

根据pos参数来删除指定的位置。

详细代码地址:https://download.csdn.net/download/bigboysunshine/11140768

参考:https://blog.csdn.net/ryanzll/article/details/7886566

发布了71 篇原创文章 · 获赞 53 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/BigBoySunshine/article/details/89486476
今日推荐