首先看一下效果
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