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()
例化。每次你创建一个PyGridTableBase时,有五个必要的方法必须被定义。表5.4说明了这些方法。
表5.4
GetNumberRows():返回一个表明grid中行数的整数。
GetNumberCols():返回一个表明grid中列数的整数。
IsEmptyCell(row,
GetValue(row,
SetValue(row,
表(table)通过使用网格(grid)的SetTable()方法被附加在grid上。在属性被设置后,grid对象将调用表
的方法来得到它绘制网格所需要的信息。grid不再显式使用grid的方法来设置值。
使用PyGridTableBase
一般情况下,有两种使用PyGridTableBase的方法。你可以显式地使你的模型类是PyGridTableBase的子类,或你可以创建一个单独的PyGridTableBase的子类,它关联你的实际的模型类。当你的数据不是太复杂
的时候,第一种方案较简单并且直观。第二种方案需要对模型和视图做很好的分离,如果你的数据复杂的话,这第二种方案是更好的。如果你有一个预先存在的数据类,你想把它用于wxPython,那么这第二种方案也是更好的,因为这样你可以创建一个表而不用去改变已有的代码。在下面一节我们将展示包含这两种方案的一个例子。
使用PyGridTableBase:特定于应用程序(不通用)的子类
我们的第一个例子将使用PyGridTableBase的一个特定于应用程序的子类作为我们的模型。由于我们小熊
队阵容的相对简单些,所以我们使用它。我们把这些数据组织到一个派生自PyGridTableBase的类。我们
把这些实际的数据配置在一个二维Python列表中,并且配置另外的方法来从列表中读。下例5.7展示了生
成自一个模型类的小熊队的阵容。
例5.7
import
import
class
class
class
if
在例5.7中,我们已经定义了所有必须的PyGridTableBase方法,并加上了额外的方法GetColLabelValue()和GetRowLabelValue()。希望你不要对这两个额外的方法感到诧异,这两个额外的方法使得表(table)能
够分别指定行和列的标签。在重构一节中,使用模型类的作用是将数据与显示分开。在本例中,我们已经
把数据移入了一个更加结构化的格式,它能够容易地被分离到一个外部文件或资源中(数据库容易被增加到这里)。
使用PyGridTableBase:一个通用的例子
实际上,上面的例子很接近一个通用的能够读任何二维Python列表的表了。下列5.8展示这通用的模型的
外观:
例5.8
import
import
class
GenericTable类要求一个数据的二维列表和一个可选的行和列标签列表。这个类适合被导入任何wxPython
程序中。使用一个做了微小改变的格式,我们现在可以使用这通用的表来显示阵容,如下例5.9所示:
例5.9
import
import
import
data
colLabels
rowLabels
class
class
if