我用wxPython搭建GUI量化系统之wx.grid实现excel功能

在数据分析中少不了会使用到像excel一样的表格来显示和编辑数据。

本节我们介绍下wx.grid.Grid的使用。

首先我们跑一个关于wx.grid.Grid测试的例程,看看整体的显示效果。

class GridFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent)
        self.grid = wx.grid.Grid(self, -1)

    def TestFunction(self):

        self.grid.CreateGrid(100, 10)
        self.grid.SetRowSize(2, 60)
        self.grid.SetColSize(0, 120)
        self.grid.SetRowLabelValue(0, "ROW")
        self.grid.SetColLabelValue(0, "COL")
        self.grid.SetCellValue(0, 0, 'wxGrid is good')
        self.grid.SetCellValue(0, 3, 'This is read.only')
        self.grid.SetReadOnly(0, 3)
        self.grid.SetCellValue(3, 3, 'green on grey')
        self.grid.SetCellTextColour(3, 3, wx.GREEN)
        self.grid.SetCellBackgroundColour(3, 3, wx.LIGHT_GREY)
        self.grid.SetColFormatFloat(5, 6, 2)
        self.grid.SetCellValue(0, 6, '3.1415')
        self.Show()

图片描述

我们挑选几个在例程中使用到的,相对常用的方法,进行逐个的介绍。

CreateGrid()方法初始化一个固定行数、列数的Grid界面。
注:行列数创建后仍可以使用以下方法增加行列:

使用AppendCols向右扩展grid更多的列或者AppendRows向下扩展grid更多的行,如下所示:

AppendCols(self, numCols=1, updateLabels=True)
AppendRows(self, numRows=1, updateLabels=True)

使用InsertCols指定位置插入更多的列扩展grid或者使用InsertRows指定位置插入更多的行扩展grid,如下所示:

InsertCols(self, pos=0, numCols=1, updateLabels=True)
InsertRows(self, pos=0, numRows=1, updateLabels=True)

SetColSizes()方法和SetRowSize()方法分别设置指定列、行的宽度、高度
SetCellValue()方法设置指定行列的单元格内的值
SetRowLabelValue()方法和SetColLabelValue()方法用于改变行标签、列标签。

为了更好地结合实际的应用场景,我们把2019年12月31日前每日RPS排名前十的股票用Grid显示出来【需要文件的可以私信我的】,只需遍历的方式调用SetCellValue()方法即可。如下所示:

图片描述

关于Grid有几个关键的事件,这里说明一下。

  •  事件EVT_GRID_CELL_CHANGING:单元格内数据发生变化中
  •  事件EVT_GRID_CELL_CHANGED:单元格内数据发生变化后
  •  事件EVT_GRID_CELL_LEFT_CLICK:左键单击单元格
  •  事件EVT_GRID_CELL_LEFT_DCLICK:左键双击单元格
  •  事件EVT_GRID_CELL_RIGHT_CLICK:右键单击单元格
  •  事件EVT_GRID_CELL_RIGHT_DCLICK:右键双击单元格
  •  事件EVT_GRID_SELECT_CELL:选中单元格事件

绑定事件的代码如下所示,第一个参数是事件,第二个参数是响应方法,第三个参数:事件对象。此处我们右键双击单元格后会使该单元格背景色变成黄色。

self.Bind(wx.grid.EVT_GRID_CELL_RIGHT_DCLICK, self.cellChanged, self.grid)

响应方法中必须要有一个event参数,这点需要特别提示。 

图片描述

当处理大型数据展示的时候,可以使用setTable()方法做到数据与界面逻辑分离。

接下来我们介绍下这种方法。

首先通过wx.grid.GridTableBase基类创建一个的自定义的子类。wx.grid.GridTableBase类保存了wx.grid.grid类要显示的实际数据,这样一来wx.grid.grid类就充当一个表类的视图。
自定义类中需要重写GetNumberRows、GetNumberCols、GetValue这些方法。

class RpsInfoGridTable(wx.grid.GridTableBase):
    def __init__(self, datas, colLabels):
        wx.grid.GridTableBase.__init__(self)

        self.datas = datas
        self.colLabels = colLabels

仍然以显示2019年12月31日前每日RPS排名前十的股票为例介绍这种方式。如下所示:

self.ReadData()
GridTable = RpsInfoGridTable(self.df_data.values, self.list_columns)
self.grid.SetTable(GridTable, True)
self.grid.AutoSize()
self.grid.Refresh()
self.Show()

图片描述

作者简介:

1-畅销书《Python股票量化交易从入门到实践》作者

2-日常运营公众号《元宵大师带你用Python量化交易》

3-CSDN视频课程《Python金融数据分析入门到实战》讲师

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值