77范文网 - 专业文章范例文档资料分享平台

python表格(2)

来源:网络收集 时间:2018-12-04 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

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)在线全文阅读。

python表格(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/337110.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: