WxPythonInAction/ChapterFourteen
? ? ? ? ? ? ? ? ? ? ? ? 首页 CPUG OpenBookProject 行者堂 更新 搜索 帮助 ChapterFourteen 只读网页 信息 附件 标题 正文 登录 14 网格(grid)控件 本章内容包括:
? ? ? ? ?
创建网格(grid)
添加行和单元格(cell),并且处理列的首部 使用一个自定义的单元格(cell)描绘器(renderer) 创建自定义的编辑器 捕获用户事件
网格控件大概是wxPython中最复杂和最灵活的一个窗口部件。在这一章,你将有机会接触到这个控件的许多特性。我们将讨论如何输入数据到网格控件以及如何处理该控件的显示属性,并且我们还将讨论自定义编辑器和描绘器。网格控件使你能够在一个类似电子表格格
式的网格中显示表格数据。该控件允许你为行和列指定标签,以及通过拖动网格线来改变网格的大小,并且可以为每个单元格单独指定字体和颜色属性。
在最常见的情况下,你一般会显示一个简单的字符串值。然而,你也能为任一单元格指定一个自定义的描绘器,以使你能够显示不同的数据;你可以有编辑表中的单元格,并且对不同的数据使用不同类型的编辑器。你还能够创建你自己自定义的描绘器和编辑器,这使得你在单元格数据的显示和处理上可以非常的灵活,几乎没有什么限制。网格控件还有大量的鼠标和键盘事件,你可以程序中捕获它们并用来触发相关的代码。
我们将通过展示两个创建wxPython网格的方法来作为我们讨论的开始。
创建你的网格
网格控件是用以显示一个二维的数据集的。要使用该控件显示有用的信息,你需要告诉该控件它工作所基于的是什么数据。在wxPython中,有两种不同的机制用于在网格控件中处理数据,它们之间在处理数据的添加,删除和编辑的方式上有些许的不同。 * 网格控件可以直接处理每行和每列中的值。
* 数据可以通过使用一个网格表(grid table)来间接地处理。
较简单的一种是使用网格控件直接处理值。在这种情况下,网格维护着数据的一份拷贝。在这种情况下,如果有大量的数据或你的应用程序已经有了一个现存的网格类的数据结构,那么这可能显得比较笨拙。如果是这样,你可以使用一个网格表来处理该网格的数据。参见第5章来回顾一下在MVC架构中,网格表是如何被作为一个模型的。
如何创建一个简单的网格?
尽管网格控件有大量的方法用于控件精确的显示和数据的管理,但时开始使用一个网格控件是十分简单的。图14.1显示了一个简单的网格,其中的单元格中添加了一些字符串数据。 图14.1
网格控件是类wx.grid.Grid的实例。由于网格类及相关类的尺寸的原因,实际中许多的程序都不使用它,wxPython的网格类存在于它们自己的模块中,它们不会被自动导入到核心的名字空间中。wx.grid.Grid的构造函数类似于其它的控件的构造函数。
切换行号显示 1 wx.grid.Grid(parent, id, pos=wx.DefaultPosition, 2 size=wx.DefaultSize, style=wx.WANTS_CHARS, 3 name=wxPanelNameStr)
其中的所有的参数与wx.Window的构造函数是相同的,并且有相同的意义。
wx.WANTS_CHARS样式是网格的默认样式,除此之外,wx.grid.Grid没有为自己定义特别的样式。由于网格类的复杂性,所以在程序中,你一般要自定义网格类的一个子类来实现一个网格,而非直接使用wx.grid.Grid的一个实例。
和我们所见过的别的控件不同,调用该构造函数不足以创建一个可用的网格。有两个方法用以初始化网格
* CreateGrid() * SetTable()
在这一节,我们将讨论一个方法,第二个方法将在网格表的讨论中提及。 要显式地初始化网格,可以使用方法
CreateGrid(numRows, numCols, selmode=wx.grid.Grid.SelectCells)。这个方
法应该在构造函数之后被直接地调用,并用必须在网格被显示之前调用。参数
numRows, numCols指定了网格的初始大小。参数selmode指定了网格中单元格的选择模式,默认值是wx.grid.Grid.SelectCells,意思是一次只选择一个单元格。其它的值有wx.grid.Grid.SelectRows,意思是一次选择整个行,
wx.grid.Grid.SelectionColumns,意思是一次选择整个列。创建之后,你可以使用方
法GetSelectionMode()来访问选择模式,并且你可以使用方法
SetSelectionMode(mode)来重置模式。你还可以使用方法GetNumberCols()和GetNumberRows()来得到行和列数。
在内部,使用CreateGrid()初始化网格之后,wxPython设置了一个二维的字符串数组。一旦网格被初始化了,你就可以使用方法SetCellValue(row, col, s)来放置数据。其中参数row, col是要设置的单元格的坐标,s是要在该坐标处显示的字符串文本。如果你想获取特定坐标处的值,你可以使用函数GetCellValue(row, col),该函数返回字符串。要一次清空整个网格,你可以使用方法ClearGrid()。例14.1显示了产生图14.1的代码。 例14.1 使用ClearGrid()创建的一个示例网格
切换行号显示 1 import wx 2 import wx.grid 3
4 class TestFrame(wx.Frame): 5 def __init__(self):
6 wx.Frame.__init__(self, None, title=\Grid\,
7 size=(640,480)) 8 grid = wx.grid.Grid(self) 9 grid.CreateGrid(50,50) 10 for row in range(20): 11 for col in range(6):
12 grid.SetCellValue(row, col,
13 \ % (row, col)) 14
15 app = wx.PySimpleApp() 16 frame = TestFrame() 17 frame.Show() 18 app.MainLoop()
CreateGrid()和SetCellValue()仅限于你的网格数据是由简单字符串组成的情况。如
果你的数据更加的复杂或表特别大的话,更好的方法是创建一个网格表,这将随后讨论。
如何使用网格表来创建一个网格?
对于较复杂的情况,你可以将你的数据保存在一个网格表中,网格表是一个单独的类,它存储数据并与网格控件交互以显示数据。推荐在下列情况下使用网格表:
* 网格的数据比较复杂 * 数据存储在你的系统中的另外的对象中 * 网格太大以致于不能一次整个被存储到内存中
在第5章中,我们在MVC设计模式中讨论了网格表以及在你的应用程序中实现一个网格表的不同方法。在本章,我们将重点放在对网格表的使用上。图14.2显示了使用网格表创建的一个网格。 图14.2
要使用一个网格表,你需要要创建wx.grid.PyGridTableBase的子类。该子类必须覆盖父类wx.grid.GridTableBase的一些方法。例14.2显示了用于创建图14.2的代码。 例14.2 关于使用网格表机制的代码
切换行号显示 1 #-*- encoding:UTF-8 -*- 2 import wx
3 import wx.grid 4
5 class TestTable(wx.grid.PyGridTableBase):#定义网格表 6 def __init__(self):
7 wx.grid.PyGridTableBase.__init__(self) 8 self.data = { (1,1) : \, 9 (2,2) : \, 10 (3,3) : \, 11 (4,4) : \, 12 } 13
14 self.odd=wx.grid.GridCellAttr()
15 self.odd.SetBackgroundColour(\) 16 self.odd.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库python表格在线全文阅读。
相关推荐: