PyGridTableBase的方法

本文介绍了wxPython中PyGridTableBase类的基本用法,包括必需的方法及其如何应用于实际项目中。通过具体示例展示了如何利用PyGridTableBase类创建自定义表格,以及如何构建通用表格来处理二维数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 wx.grid.PyGridTableBase有一些方法,它们中的许多你不会用到。这个类是抽象的,并且不能被直接实
例化。每次你创建一个PyGridTableBase时,有五个必要的方法必须被定义。表5.4说明了这些方法。

表5.4 wx.grid.PyGridTableBase的必须的方法

GetNumberRows():返回一个表明grid中行数的整数。

GetNumberCols():返回一个表明grid中列数的整数。

IsEmptyCell(row, col):如果索引(row,col)所表示的单元是空的话,返回True。

GetValue(row, col):返回显示在单元(row,col)中的值。

SetValue(row, col,value):设置单元(row,col)中的值。如果你想要只读模式,你仍必须包含这个方法,但是你可以在该函数中使用pass。

表(table)通过使用网格(grid)的SetTable()方法被附加在grid上。在属性被设置后,grid对象将调用表
的方法来得到它绘制网格所需要的信息。grid不再显式使用grid的方法来设置值。

使用PyGridTableBase

一般情况下,有两种使用PyGridTableBase的方法。你可以显式地使你的模型类是PyGridTableBase的子类,或你可以创建一个单独的PyGridTableBase的子类,它关联你的实际的模型类。当你的数据不是太复杂
的时候,第一种方案较简单并且直观。第二种方案需要对模型和视图做很好的分离,如果你的数据复杂的话,这第二种方案是更好的。如果你有一个预先存在的数据类,你想把它用于wxPython,那么这第二种方案也是更好的,因为这样你可以创建一个表而不用去改变已有的代码。在下面一节我们将展示包含这两种方案的一个例子。

使用PyGridTableBase:特定于应用程序(不通用)的子类

我们的第一个例子将使用PyGridTableBase的一个特定于应用程序的子类作为我们的模型。由于我们小熊
队阵容的相对简单些,所以我们使用它。我们把这些数据组织到一个派生自PyGridTableBase的类。我们
把这些实际的数据配置在一个二维Python列表中,并且配置另外的方法来从列表中读。下例5.7展示了生
成自一个模型类的小熊队的阵容。

例5.7 生成自PyGridTableBase模型的一个表

import wx
import wx.grid

class LineupTable(wx.grid.PyGridTableBase):

    data (("CF", "Bob", "Dernier"), ("2B", "Ryne", "Sandberg"),
        ("LF", "Gary", "Matthews"), ("1B", "Leon", "Durham"),
        ("RF", "Keith", "Moreland"), ("3B", "Ron", "Cey"),
        ("C", "Jody", "Davis"), ("SS", "Larry", "Bowa"),
        ("P", "Rick", "Sutcliffe"))

    colLabels ("Last", "First")

    def __init__(self):
        wx.grid.PyGridTableBase.__init__(self)

    def GetNumberRows(self):
        return len(self.data)

    def GetNumberCols(self):
        return len(self.data[0]) 1

    def GetColLabelValue(self, col):
        return self.colLabels[col]

    def GetRowLabelValue(self, row):
        return self.data[row][0]

    def IsEmptyCell(self, row, col):
        return False

    def GetValue(self, row, col):
        return self.data[row][col 1]

    def SetValue(self, row, col, value):
        pass

class SimpleGrid(wx.grid.Grid):
    def __init__(self, parent):
        wx.grid.Grid.__init__(self, parent, -1)
        self.SetTable(LineupTable()) #设置表

class TestFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, -1, "A Grid",
        size=(275, 275))
        grid SimpleGrid(self)

if __name__ == '__main__':
    app wx.PySimpleApp()
    frame TestFrame(None)
    frame.Show(True)
    app.MainLoop()

在例5.7中,我们已经定义了所有必须的PyGridTableBase方法,并加上了额外的方法GetColLabelValue()和GetRowLabelValue()。希望你不要对这两个额外的方法感到诧异,这两个额外的方法使得表(table)能
够分别指定行和列的标签。在重构一节中,使用模型类的作用是将数据与显示分开。在本例中,我们已经
把数据移入了一个更加结构化的格式,它能够容易地被分离到一个外部文件或资源中(数据库容易被增加到这里)。

使用PyGridTableBase:一个通用的例子

实际上,上面的例子很接近一个通用的能够读任何二维Python列表的表了。下列5.8展示这通用的模型的
外观:

例5.8 一个关于二维列表的通用的表

import wx
import wx.grid

class GenericTable(wx.grid.PyGridTableBase):
            
    def __init__(self, data, rowLabels=None, colLabels=None):
        wx.grid.PyGridTableBase.__init__(self)
        self.data data
        self.rowLabels rowLabels
        self.colLabels colLabels
        
    def GetNumberRows(self):
        return len(self.data)

    def GetNumberCols(self):
        return len(self.data[0])

    def GetColLabelValue(self, col):
        if self.colLabels:
            return self.colLabels[col]
        
    def GetRowLabelValue(self, row):
        if self.rowLabels:
            return self.rowLabels[row]
        
    def IsEmptyCell(self, row, col):
        return False

    def GetValue(self, row, col):
        return self.data[row][col]

    def SetValue(self, row, col, value):
        pass         

GenericTable类要求一个数据的二维列表和一个可选的行和列标签列表。这个类适合被导入任何wxPython
程序中。使用一个做了微小改变的格式,我们现在可以使用这通用的表来显示阵容,如下例5.9所示:

例5.9 使用这通用的表来显示阵容

import wx
import wx.grid
import generictable

    
data (("Bob", "Dernier"), ("Ryne", "Sandberg"), 
        ("Gary", "Matthews"), ("Leon", "Durham"),
        ("Keith", "Moreland"), ("Ron", "Cey"),
        ("Jody", "Davis"), ("Larry", "Bowa"),
        ("Rick", "Sutcliffe"))
            
colLabels ("Last", "First")
rowLabels ("CF", "2B", "LF", "1B", "RF", "3B", "C", "SS", "P")
                   

class SimpleGrid(wx.grid.Grid):
    def __init__(self, parent):
        wx.grid.Grid.__init__(self, parent, -1)
        tableBase generictable.GenericTable(data, rowLabels, 
                colLabels)
        self.SetTable(tableBase)                   

class TestFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, -1, "A Grid", 
                size=(275, 275))
        grid SimpleGrid(self)

if __name__ == '__main__':
    app wx.PySimpleApp()
    frame TestFrame(None)
    frame.Show(True)
    app.MainLoop()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值