PyGridTableBase的方法

 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()

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值