17
18 self.even=wx.grid.GridCellAttr()
19 self.even.SetBackgroundColour(\) 20 self.even.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD)) 21 22
23 # these five are the required methods 24 def GetNumberRows(self): 25 return 50 26
27 def GetNumberCols(self): 28 return 50 29
30 def IsEmptyCell(self, row, col):
31 return self.data.get((row, col)) is not None 32
33 def GetValue(self, row, col):#为网格提供数据 34 value = self.data.get((row, col)) 35 if value is not None: 36 return value 37 else:
38 return '' 39
40 def SetValue(self, row, col, value):#给表赋值 41 self.data[(row,col)] = value 42 43
44 # the table can also provide the attribute for each cell
45 def GetAttr(self, row, col, kind):
46 attr = [self.even, self.odd][row % 2] 47 attr.IncRef() 48 return attr 49 50 51
52 class TestFrame(wx.Frame): 53 def __init__(self):
54 wx.Frame.__init__(self, None, title=\Table\,
55 size=(640,480)) 56
57 grid = wx.grid.Grid(self)
58
59 table = TestTable()
60 grid.SetTable(table, True) 61 62
63 app = wx.PySimpleApp() 64 frame = TestFrame() 65 frame.Show() 66 app.MainLoop()
在例14.2中,所有特定于应用程序的逻辑都已被移到了网格表类,所以这里就没有必须创建一个自定义的wx.grid.Grid的子类。
要使网格表有效,你必须覆盖5个方法。表14.1列出了这些方法。在这一章中,我们还会看到其它你能覆盖的方法,你可以覆盖它们以给于你的表更多的功能。 表14.1 wx.grid.GridTableBase中需要被覆盖的方法
GetNumberCols() GetNumberRows() GetValue(row, col) IsEmptyCell(row, col) 返回显示在网格中的列的数目 返回显示在网格中的行的数目 返回坐标(row, col)处的值 如果坐标(row, col)处的单元格为空的话,返回True。否则返回False。 SetValue(row, col, value):如果你需要的话,它使你能够更新你底层的数据结构以匹配用户的编辑。对于一个只读的表,你仍然需要声明该方法,但是你可以通过pass来使
它什么也不做。该方法在当用户编辑一个单元格时自动被调用。 要将网格表实例附着于你的表的实例,要调
用 SetTable(table,takeOwnership=False,selmode=wx.grid.Grid.SelectCells)方法。其中参数table是你的wx.grid.PyGridTableBase的实例。参数
takeOwnership使得网格控件拥有这个表。如果takeOwnership为True,那么当网格被删除时,该表也被wxPython系统删除。参数selmode作用等同于在CreateGrid()中的作用。
还有一些其它的方法你可以覆盖,以处理网格的各部分,而非表的数据。在本章的稍后部分,我们将讨论这些方法中的一些。并且,我们将看到在某些情况中,使用SetTable创建的表的行为与使用CreateGrid()创建的表的行为是不同的。
你能够覆盖的另一个方法是Clear(),它在当对网格调用ClearGrid()时被调用,如果适当的话,你可以覆盖该方法来清除潜在的数据源。在网格中置入数据了以后,你现在可以开始对网格作各种有兴趣的事情了。在下一节,我们将给你展示如何处理网格的外观。
使用网格工作
一旦网格被创建并初始化了,你就可以用很多不同的方法来处理它了。单元格、行或列可以被添加和删除。你可以增加首部,改变一行或一列的大小,并可以用代码的方式来改变网格的可见部分或被选择的部分。下面的几节,我们将涉及这些内容。
如何添加、删除行,列和单元格?
在网格被创建之后,你仍然可以添加新的行和列。注意,依据网格的创建方法不同,该机制的工作也不同。你可以使用AppendCols(numCols=1)方法在你的网格的右边增加一列。使用AppendRows(numRows=1)在网格的底部增加一行。
如果不是想在网格的行或列的最后添加一行或一列,你可以使用方法
InsertCols(pos=0, numCols=1)或InsertRows(pos=1, numRows=1)来在指定位置添加。其中参数pos代表被添加的新元素中第一个的索引。如果参数numRows或numCols
大于1 ,那么有更多的元素被添加到起始位置的右边(对于列来说),或起始位置的下边(对于行来说)。
要删除一行或一列,你可以使用方法DeleteCols(pos=0, numCols=1)和
DeleteRows(pos=0, numRows=1)。其中参数pos是要被删除的行或列的第一个的索引。 如果网格是使用CreateGrid()方法被初始化的,那么上面讨论的方法总是可以工作的,并且在新的行或列中创建的单元格是以一个空字符串从为初始值的。如果网是使用
SetTable()方法被初始化的,那么网格表必须支持对表的改变。
要支持改变,你的网格表要对同样的改变方法进行覆盖。例如,如果你对你的网格调用了
InsertCols()方法,那么网格表也必须声明一个InsertCols(pos=0, numCols=1)方法。该网格表的这个方法返回布尔值True表示支持改变,返回False则否决改变。例如,
要创建一个只允许被扩展到50行的一个表,可以在你的网格表中写上下面的方法。
切换行号显示 1 def AppendRows(self, numRows=1): 2 return (self.GetRowCount() + numRows) = 50
某些对网格的改变不会立即被显示出来,而是要等待网格被刷新。你可能通过使用
ForceRefresh()方法来触发一个即时的刷新。在通常情况下,如果你用代码的方式来改变你的网格,则改变不会立即显示出来,那么插入对ForceRefresh()方法的调用可以确保
你的改变即时的显示出来。
如果你在对一个网格作一个大量的改变,而你在改变期间不想让网格的显示产生闪烁的话,你可以通过使用BeginBatch()方法来告诉该网格去作一个批量的处理。该方法将针对网格作一个内在的增量计数。你也必须在批量的任务之后调用EndBatch()——该方法针对网格作一个内在的减量计数。当计数值比0大时,表明正处于开始和结束计数之间,网格这
时不会重绘。如果必要的话,你还可以在批量处理中再嵌套批量处理。同样,在全部的批量处理没有完成时,网格不会重绘。
如何处理一个网格的行和列的首部?
在一个wxPython的网格控件中,每行和每列都有它们自己的标签。默认情况下,行的标签是数字,从1开坮。列的标签是字母,从A开始。wxPython提供了一些方法来改变这些标签。图14.3显示了一个带有首部标签的网格。 图14.3
例子14.3显示了产生图14.3的代码。其中网格是用CreateGrid()初始化的。 例14.3 带自定义标签的一个非模式的网格
切换行号显示 1 import wx 2 import wx.grid 3
4 class TestFrame(wx.Frame): 5
6 rowLabels = [\, \, \, \, \] 7 colLabels = [\, \, \, \, \] 8
9 def __init__(self):
10 wx.Frame.__init__(self, None, title=\Headers\,
11 size=(500,200)) 12 grid = wx.grid.Grid(self) 13 grid.CreateGrid(5,5) 14 for row in range(5): 15 #1 start
16 grid.SetRowLabelValue(row, self.rowLabels[row])
17 grid.SetColLabelValue(row, self.colLabels[row]) 18 #1 end
19 for col in range(5):
20 grid.SetCellValue(row, col,
21 \ % (self.rowLabels[row], self.colLabels[col])) 22
23 app = wx.PySimpleApp() 24 frame = TestFrame() 25 frame.Show() 26 app.MainLoop()
正如添加和删除行一样,改变标签也是根据网格的类型而不同的。对于使用CreateGrid()创建的网格,要使用SetColLabelValue(col, value)和
SetRowLabelValue(row, value)方法来设置标签值,如#1所示。参数col和row是列和行的索引,value是要显示在标签中的字符串。要得到一行或一列的标签,使用GetColLabelValue(col)和GetRowLabelValue(row)方法。
对于使用外部网格表的一个网格控件,你可以通过覆盖网格表的GetColLabelValue(col)和GetRowLabelValue(row)方法来达到相同的作用。为了消除混淆,网格控件在当它需要显示标签并且网格有一个关联的表时,内在地调用这些方法。由于返回值是动态地由你在覆盖的方法中所写的代码决定的,所以这里不需要覆盖或调用set*方法。不过set*方法仍然存在——SetColLabelValue(col, value)和
SetRowLabelValue(row, value)——但是你很少会使用到,除非你想让用户能够改变潜在的数据。通常,你不需要set*方法。例14.4显示了如何改变网格表中的标签——这个例子产生与上一例相同的输出。
例14.4 带有自定义标签的使用了网格表的网格
切换行号显示 1 import wx 2 import wx.grid 3
4 class TestTable(wx.grid.PyGridTableBase): 5 def __init__(self):
6 wx.grid.PyGridTableBase.__init__(self) 7 self.rowLabels = [\, \, \, \, \]
8 self.colLabels = [\, \, \, \, \] 9
10 def GetNumberRows(self): 11 return 5 12
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库python表格(2)在线全文阅读。
相关推荐: