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