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()。这样数据就可以展示了。

三、修改数据

默认是不能修改数据的,会提示需要重写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

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个使用wxPython插入table展示表格支持的实例代码: ```python import wx import wx.grid as gridlib class MyGrid(gridlib.Grid): def __init__(self, parent): gridlib.Grid.__init__(self, parent) # 创建表格 self.CreateGrid(5, 5) # 设置行和列的大小 for i in range(5): self.SetRowSize(i, 25) self.SetColSize(i, 125) # 设置表格头 self.SetColLabelValue(0, "ID") self.SetColLabelValue(1, "Name") self.SetColLabelValue(2, "Age") self.SetColLabelValue(3, "Gender") self.SetColLabelValue(4, "Occupation") # 设置表格数据 self.SetCellValue(0, 0, "001") self.SetCellValue(0, 1, "John") self.SetCellValue(0, 2, "25") self.SetCellValue(0, 3, "Male") self.SetCellValue(0, 4, "Engineer") # 加行 def add_row(self): self.AppendRows(1) # 除行 def delete_row(self): selected_row = self.GetSelectedRows()[0] self.DeleteRows(pos=selected_row, numRows=1) # 修单元格 def update_cell(self, row, col, value): self.SetCellValue(row, col, value) # 询单元格 def query_cell(self, row, col): return self.GetCellValue(row, col) class MyFrame(wx.Frame): def __init__(self, parent, title): wx.Frame.__init__(self, parent, title=title, size=(500, 300)) # 创建界面 panel = wx.Panel(self) vbox = wx.BoxSizer(wx.VERTICAL) grid = MyGrid(panel) vbox.Add(grid, 1, wx.EXPAND) hbox = wx.BoxSizer(wx.HORIZONTAL) add_button = wx.Button(panel, label="Add") add_button.Bind(wx.EVT_BUTTON, lambda event: grid.add_row()) delete_button = wx.Button(panel, label="Delete") delete_button.Bind(wx.EVT_BUTTON, lambda event: grid.delete_row()) update_button = wx.Button(panel, label="Update") update_button.Bind(wx.EVT_BUTTON, lambda event: grid.update_cell(0, 0, "002")) query_button = wx.Button(panel, label="Query") query_button.Bind(wx.EVT_BUTTON, lambda event: print(grid.query_cell(0, 0))) hbox.Add(add_button, 1, wx.EXPAND) hbox.Add(delete_button, 1, wx.EXPAND) hbox.Add(update_button, 1, wx.EXPAND) hbox.Add(query_button, 1, wx.EXPAND) vbox.Add(hbox, 0, wx.EXPAND) panel.SetSizer(vbox) if __name__ == '__main__': app = wx.App() frame = MyFrame(None, "Table Example") frame.Show() app.MainLoop() ``` 在这个示例中,我们创建了一个MyGrid类,继承自wxPython中的Grid类,并实现了添加行、除行、修单元格和询单元格等方法。然后,我们在MyFrame类中创建了界面,并将MyGrid添加到界面中。同时,我们为界面中的按钮绑定相应的事件,以实现功能。最后,我们启动了wxPython应用程序的主循环,以显示界面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值