17 grid.SetColSize(1, 125) 18 grid.SetRowSize(1, 100) 19
20 app = wx.PySimpleApp() 21 frame = TestFrame() 22 frame.Show() 23 app.MainLoop()
改变单元格的尺寸
一个作用于单元格尺寸的基本的方法是使它跨多行或多列,类似于HTML的rowspan和colspan。要达到这种效果,在wxPython中可以使用方法SetCellSize(row, col, num_rows, num_cols)。该方法设置坐标row,col处的单元格跨num_rows行和num_cols列。在通常的情形下,每个单元格占据一行和一列,要使用单元格不止占据一行或一列,你需要给参数num_rows, num_cols大于1的值。参数num_rows, num_cols的值小于等于0会导致错误。如果你的设置使得一个单元格的尺寸与另一个早先声明为跨越的单元格的尺寸相重叠时,早先的这个单元格的尺寸会重置为占据一行和一列。你也能够使用方法SetCellOverflow(row, col, allow)方法来关闭单元格的跨越显示。只要在该方法中使用pass就可以阻止单元格跨越了,即使已经使用了SetCellSize()方法来设置它的尺寸。
调整网格的尺寸的一个更加典型的方法是基于一行或一列来处理其像素尺寸。你可以使用
SetColSize(col, width)和SetRowSize(row, height)方法来改变一列或一行的宽度。当然,你可以使用GetColSize(col)或GetRowSize(row)来确定一列或一行的当前
尺寸。 设置默认尺寸
你可以通过改变所有的行和列的默认尺寸来改变整个网格的尺寸。方法如下:
SetDefaultColSize(width, resizeExistingCols=False) SetDefaultRowSize(height, resizeExistingRows=False)
其中的第一个参数是以像素为单位的新的默认尺寸。如果第二个布尔参数的值是True,那么当前存在的所有行或列立即被调整到新的默认尺寸。如果第二个参数的值为False,那么这个新的默认尺寸仅被应用于新添加的行或列。通常,设置新的默认值是在初始化的开头,甚至是在调用CreateGrid()或SetTable()之前。你可以使用GetDefaultColSize()和GetDefaultRowSize()方法来得到当前的默认尺寸。
设置默认尺寸与为单个行或列设置尺寸相比,有一个性能上的问题。对于存储默认值,
wxPython只需要存储这两个整数。如果你将单个行或列设置到一个非默认的尺寸,
wxPython切换并将每个行或列的尺寸存储到一个数组中。如果你的表是非常的大的话,这
将明显地占用很多的内存,因此这是需要注意的。
有时,你想为一行或一列设置一个最小的尺寸,以便不用担心程序的某个方法的调用或用户对网格线的拖动会致使该行或列变得更小。
在wxPython中,你可以对一个网格的宽度设置最小值或为单独的行和列分别设置最小尺寸值。要改变整个网格的最小尺寸,可以使用方法
SetColMinimalAcceptableWidth(width)或
SetRowMinimalAcceptableHeight(height)。其中的参数是针对所有行或列的最小的像素尺寸。要一行一行的设置最小尺寸,使用方法SetColMinimalWidth(col, width)或SetRowMinimalHeight(row, height)。其中第一个参数是要调整尺寸的项目的索引,
第二个参数是以像素为单位的新的尺寸。单个的行的最小尺寸必须比最小的网格尺寸大,如果单个的行的最小尺寸被设置了的话。上面的set*方法都有一个相应的get*方法: * GetColMinimalAcceptableWidth() * GetRowMinimalAcceptableHeight() * GetColMinimalWidth(col) * GetRowMinimalHeight(row) 设置标签的尺寸
网格上的标签区域有一套单独的调整尺寸的函数。在这种情况下,你是在设置行标签的宽度和列标签的高度,意思就是,把列标签作为一个特殊的行,把行标签作为一个特殊的列。
set*方法有SetRowLabelSize(width),它设置行标签的宽度,
SetColLabelSize(height),它设置列标签的高度。你可以使用相应的GetRowLabelSize()和GetColLabelSize()方法来得到这些尺寸。
通常,你不会关心单元格的实际的像素尺寸,你希望它们被自动调整到足够显示你的数据的大小。在wxPython中,你可以通过使用AutoSize()方法来自动调整整个网格的尺寸。该方法使得所有的行和列的尺寸与它们中的内容相适应。你也可以对单个的行或列使用
AutoSizeColumn(col, setAsMin=True)和AutoSizeRow(row, setAsMin=True)来使它们的尺寸自动与其中的内容相适应。如果参数setAsMin为True,那么新的自动的尺寸将作为该行或列的最小尺寸。AutoSizeColumns(setAsMin=True)和AutoSizeRows(setAsMin=True)自动调整所有的列和行的尺寸。
你也可以让用户通过拖动标签单元格的边框来调整行的尺寸。用于实现这种行为的主要的方法如下:
? ? ?
EnableDragColSize(enable=True):控制用户能否通过拖动边框来改变标签的
宽度
EnableDragRowSize(enable=True):控制用户能否通过拖动边框来改变标签的
高度
EnableDragGridSize(enable=True):控制用户能否通过拖动边框一次性改变
标签的宽度和高度
下面的方法是上面方法的相应的使拖动无效的简便的方法:
? ?
DisableDragColSize() DisableDragRowSize()
?
DisableDragGridSize()
下面的一套方法用以判断能否拖动:
? ? ?
CanDragColSize() CanDragRowSize() CanDragGridSize()
如何管理哪些单元格处于选择或可见状态?
在网格控件中,用户可以选择一个或多个单元格。在wxPython中,有几个方法让你能够处理多选的情况。
在下面的几个情况中,网格控件中的被选择的项可以是0个或多个:
? ? ? ?
单个的处于选择状态的单元格 被选择的行 被选择的行
被选择的由单元格组成的块
用户可以通过命令或在单元格、行或列标签上的敲击,或拖动鼠标来选择多组单元格。要确定网格中是否有被选择的单元格,可能使用方法IsSelection(),如果有则该方法返回True。你可以通过使用IsInSelection(row, col)方法来查询任意一个特定的单元格当前是否处于选择状态中,如果是则返回True。
表14.2显示了几个方法,它们得到当前被选择的内容并返回给你。 表14.2 返回当前被选择的单元格的集的方法
GetSelectedCells() 返回包含一些单个的处于选择状态的单元格的一个Python列表。在这个列表中的每个项目都是一个(row, col)元组。 返回由通过敲击列的标签而被选择的列的索引组成的一个Python列表。 返回由通过敲击行的标签而被选择的列的索引组成的一个Python列表。 返回包含一些被选择的由单元格组成的块的一个Python列表。其中的每个元素都时一个(row, col)元组,(row, col)元组是每块的左上角。 返回包含一些被选择的由单元格组成的块的一个Python列表。其中的每个元素都时GetSelectedCols() GetSelectedRows() GetSelectionBlockTopLeft() GetSelectionBlockBottomRight() 一个(row, col)元组,(row, col)元组是每块的右下角。 这儿也有几个用于设置或修改选择状态的方法。第一个是ClearSelection(),它清除当有的被选状态。在该方法被调用以后,IsSelection()返回False。你也可以做一个相反的动作,就是使用SelectAll()选择所有的单元格。你也可以使用方法SelectCol(col, addToSelected=False)和
SelectRow(row, addToSelected=False)来选择整列或整行。在这两个方法中,第一个参数是要选择的行或列的索引。如果参数addToSelected为True,所有另外被选择的单元格仍然处于被选状态,并且该行或列也被增加到已有的选择中。如果参数
addToSelected为False,那么所有另外被选择的单元格解除被选状态,而新的行或列代
替它们作为被选择对象。同样地,你也可以使用方法
SelectBlock(topRow, leftCol, bottomRow, rightCol, addToSelected=False)来增加一个对一块范围的选择,前面四个参数是所选的范围的对角,addToSelected
参数的作用同前一样。
你也可以使用IsVisible(row, col, wholeCellVisible=True)方法来得到一个特定的单元格在当前的显示中是否是可见的。如果该单元格当前显示在屏幕上了(相对于处在一个可滚动的容器的不可见部分而言),那么该方法返回True。如果参数wholeCellVisible为True,那么单元格要整个都是可见的,方法才返回True,如果参数wholeCellVisible为False,则单元格部分可见,方法就会返回True。方法MakeCellVisible(row, col)通过滚动确保了指定位置的单元格是可见的。
除了被选的单元格外,网格控件也有一个光标单元格,它代表获得当前用户焦点的单元格。你可以使用GetGridCursorCol()和GetGridCursorRow()方法来确定光标的当前位置,这两个方法返回整数的索引值。你可以使用SetGridCursor(row, col)方法来显式地放置一个光标。该方法除了移到光标外,它还隐式地对新的光标位置调用了
MakeCellVisible。
表14.3说明了在网格坐标和显示器坐标之间作转换的网格控件的方法。 表14.3 坐标转换方法
参数topLeft, bottomRight是单元格的坐标((row, col)元组的形式)。返回值是一个BlockToDeviceRect(topLeft, bottomRight) wx.Rect,wx.Rect使用给定的网格坐标所包围的矩形的设备像素坐标。 返回一个wx.Rect,wx.Rect的坐标是相对网格坐标(row, col)处的单元格的容器的坐标。 CellToRect(row, col)